Last updated May 22, 2024

Preparing for Jira Software 10.0 and Jira Service Management 6.0

This documentation is intended for Jira developers who want to ensure that their existing apps are compatible with Jira Software 10.0 and Jira Service Management 6.0.

Version history

ApplicationVersion numberMaven version numberRelease date
EAP 03
Jira Software10.0.0-EAP0310.0.0-m00046 May 2024
Jira Service Management6.0.0-EAP036.0.0-m00046 May 2024
EAP 02
Jira Software10.0.0-EAP0210.0.0-m000327 March 2024
Jira Service ManagementN/AN/AN/A

Downloads

All source files are available on the following pages:

EAP releases are not for production or demonstration use.

Known issues

The following subsystems are known to be not functional in this release:

  • Advanced Roadmaps may be unstable and not functioning correctly
  • Jira Cloud Migration Assistant doesn’t load
  • DVCS doesn’t load
  • The Manage Apps page shows apps out of date with MPAC
  • Overall stability issues across the system

Coming up next

Here's what you can expect in future EAP releases of Jira Software 10.0 and Jira Service Management 6.0:

  • Completing the migration to RESTv2 across all Atlassian apps
  • Removing deprecated dependencies
  • Removing deprecated code
  • Changing the Java language level to 17
  • Platform 7 (including removal of RESTv1)

Changes introduced in EAP 03 (6 May 2024)

For more details about what’s in scope of this EAP release, check out the following updates:

Allowlist your Velocity files on the filesystem

added Jira Software Jira Service Management

We’re making steps towards verifiably secure installation directories for all Data Center products. This change not only increases the difficulty for an attacker to exploit filesystem access, but also allows customers to verify the state of the product installation.

Starting from Bamboo 10.0, Bitbucket 9.0, Confluence 9.0, Crowd 6.0, Jira Software 10.0, and Jira Service Management 6.0, all Velocity files stored on the filesystem (that is, shared, local home, or other) will need to be explicitly allowlisted. Files stored inside of .jar archives and bundled within plugins won’t be affected.

In Confluence, Jira Software, and Jira Service Management, you can update the Velocity engine configuration to add files to the allowlist. This must be repeated for each new engine instance.

The following property is cached when the Velocity engine starts, enhancing performance and making it more difficult for attackers to disable.

1
2
velocity.addProperty(Velocity.RESOURCE_FILE_ALLOWLIST, "relative/file/path.vm")

However, we recommend migrating them to the database in every product.

Allowlist your Velocity template class and method invocations

added Jira Software Jira Service Management

Similarly to Confluence 9.0, we’re planning to migrate the method invocations in Velocity templates to an allowlist approach. All method invocations within a Velocity template will be explicitly allowed using a newly introduced annotation or app module descriptor.

The following classes and methods are allowed:

  • introspector.allowlist.classes = java.io.Serializable
  • java.io.ObjectInputValidation
  • java.lang.reflect.Proxy
  • net.sf.hibernate.proxy.HibernateProxy
  • org.springframework.cglib.proxy.Facto
  • introspector.allowlist.methods = getEditVM
  • removeHtmlTags
  • htmlEncode
  • escapeHtml
  • getLabelSearchPath
  • encodeHtml
  • encodeForHtml

Turn off the lights with dark theme

added Jira Software Jira Service Management

This change is still a work in progress.

In Jira Software 10.0 and Jira Service Management 6.0 EAP 03, dark theme becomes partially available for the first time so that you can start preparing your Data Center app to support it and allow us to gather more feedback.

For more information about adjusting your app to dark theme, visit Prepare your Data Center app for the dark theme.

Known issues

The following components don’t support dark theme yet:

  • Dashboards
  • Plans
  • Help us improve Jira dialog
  • Automation for Jira
  • Parts of the administration area
  • Some reports

The following areas have known visual issues:

  • Profile summary page
  • Some parts of the administration area:
    • Troubleshooting and support page
    • Administering personal access tokens page
    • Terminology page
    • Content delivery network page
    • Rate limiting page
  • Backlog view
  • Create project dialog

Upgrade to Groovy 4

added Jira Service Management

To improve security, functionality, and syntax support, we’re planning to upgrade from Groovy 2 to Groovy 4 in Jira Service Management 6.0. If you’ve been using Groovy scripts in Assets, test your existing scripts against this EAP release of Jira Service Management 6.0 or the Groovy 4 console.

Here’s a rundown of the most important breaking changes:

If you run into the following issue with JsonSlurper, replace JsonSlurper with Jackson ObjectMapper.

1
2
java.lang.RuntimeException: Unable to load FastStringService
  at org.apache.groovy.json.internal.FastStringUtils.getService(FastStringUtils.java:56) ~[?:?]
  at org.apache.groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:66) ~[?:?]
  at org.apache.groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:114) ~[?:?]
  at groovy.json.JsonSlurper.parseText(JsonSlurper.java:205) ~[?:?]

The following table lists the changes to the names of classes, packages, and modules.

For the full list of breaking changes, check out:

Class/package/module nameGroovy 2Groovy 4
groovy-xmlgroovy.utilgroovy.xml
groovygroovy.xml.QNamegroovy.namespace
groovy-antgroovy.utilgroovy.ant
groovy-consolegroovy.inspectgroovy.console
groovy.inspect.swingui
groovy.ui
groovy.console.ui
groovy.ui.ConsoleAppletDeprecated
groovy-groovyshorg.codehaus.groovy.tools.shellorg.apache.groovy.groovysh
groovy-jmxgroovy.util.GroovyMBeangroovy.jmx
groovy-nioorg.codehaus.groovy.runtime.NioGroovyMethodsorg.apache.groovy.nio.extensions.NioExtensions
org.codehaus.groovy.runtime.WritablePathorg.apache.groovy.nio.runtime
groovy-swingorg.codehaus.groovy.bindingorg.apache.groovy.swing.binding
groovy.modelgroovy.swing.model
groovy.inspect.swinguiorg.apache.groovy.swing.table
groovy-testorg.codehaus.groovy.runtime.ScriptTestAdapterorg.apache.groovy.test
groovy.transform.NotYetImplementedgroovy.test.NotYetImplemented
groovy.utilgroovy.test
groovy.langgroovy.test
GroovyClassLoaderTypes for sourceCache and classCache have changed from Map to stronger types

Breaking changes to the Java and REST APIs in EAP03

removed Jira Software Jira Service Management

We’ve removed access to a number of dependencies from Jira Software 10.0 and Jira Service Management 6.0, which are currently accessible in Jira Software 9.x and Jira Service Management 5.x:

ChangeInstructions
Jira Service Management Upgrade from Groovy 2 to Groovy 4 in AssetsMigrate all groovy code to be compatible with Groovy 4.
Jira Service Management Removal of the http-builder library from Groovy console and scripts.Switch to the native Groovy GET and POST methods.
com.atlassian.jira.util.AttachmentConfigUse AttachmentConfigManager#getTemporaryAttachmentDirectory() instead.
com.atlassian.jira.issue.attachment.AttachmentStore

Use alternative methods provided by:

  • AttachmentManager
  • ThumbnailManager
  • AttachmentConfigManager
com.atlassian.jira.util.AttachmentUtils

To create, read, or delete attachment and thumbnail data directly, Use the methods available in AttachmentManager and ThumbnailManager.

To find the temporary attachment directory, use AttachmentConfigManager#getTemporaryAttachmentDirectory().

The attachment and thumbnail directories for a particular issue are no longer exposed. Instead, use:

  • getThumbnailDirectory()
  • getAttachmentDirectory()

To manage individual attachments or store other data elsewhere, use:

  • AttachmentManager
  • ThumbnailManager

getAttachmentStore() - AttachmentStore has been removed.

getTemporaryAttachmentDirectory() - Use AttachmentConfigManager#getTemporaryAttachmentDirectory() instead.

getAttachmentFile and getThumbnailFile methods - Use AttachmentManager and ThumbnalManager eg. AttachmentManager#streamAttachmentContent.

checkValidAttachmentDirectory and checkValidTemporaryAttachmentDirectory - These checks can be omitted. Jira checks the validity of paths during startup.

AttachmentManager#attachmentsEnabled()Use AttachmentConfigManager#isAttachmentsEnabled() instead.
AttachmentManager#disableAttachments()No alternative provided
AttachmentManager#createAttachmentCopySourceFile and previously deprecated overloads of AttachmentManager#createAttachmentUse Use AttachmentManager#createAttachment(CreateAttachmentParamsBean) instead.
com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean#CreateAttachmentParamsBeanInstead, use the provided builder:
com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean.Builder
AttachmentManager#deleteAttachmentDirectory(Issue)To delete an issue, use IssueManager#deleteIssue instead.
Remove deprecated REST API endpoint:
GET /rest/api/2/group
provided by
com.atlassian.jira.rest.v2.issue.GroupResource#getGroup
GET /rest/api/2/group ([https://docs.atlassian.com/software/jira/docs/api/REST/9.14.0/#api/2/group-getGroup](https://docs.atlassian.com/software/jira/docs/api/REST/9.14.0/#api/2/group-getGroup) is going to be removed
Use GET /rest/api/2/group/member instead:
[https://docs.atlassian.com/software/jira/docs/api/REST/9.14.0/#api/2/group-getUsersFromGroup](https://docs.atlassian.com/software/jira/docs/api/REST/9.14.0/#api/2/group-getUsersFromGroup "https://docs.atlassian.com/software/jira/docs/api/REST/9.14.0/#api/2/group-getUsersFromGroup")
provided by com.atlassian.jira.rest.v2.issue.GroupResource#getUsersFromGroup
Disabling runtime compilation of JavaServer Pages (JSP).Affected vendors have been contacted.
There is no longer any support for modifying the JSP.
[Public documentation](https://hello.atlassian.net/wiki/spaces/SERVER/pages/3533683978 "https://hello.atlassian.net/wiki/spaces/SERVER/pages/3533683978") will be updated.
Public endpoint DELETE /rest/api/2/version/{id}
provided by
com.atlassian.jira.rest.v2.issue.VersionResource#delete(java.lang.String, java.lang.String, java.lang.String) removed along with public API methods:
com.atlassian.jira.bc.project.version.VersionService#delete(JiraServiceContext, ValidationResult)
com.atlassian.jira.project.version.VersionManager#deleteVersion(ApplicationUser, Version, Option<Version>, Option<Version>)
Use
POST /rest/api/2/version/{id}/removeAndSwap
provided by
com.atlassian.jira.rest.v2.issue.VersionResource#delete(String, DeleteAndReplaceVersionBean)
For the Public API use the following replacements:
com.atlassian.jira.bc.project.version.VersionService#deleteVersionAndSwap
com.atlassian.jira.project.version.VersionManager#deleteVersionAndSwap
Velocity upgraded to 1.6.4.atlassian_28 to receive path traversal preventionN/A
Block Velocity file URL access in webapp directoryWe don't use any .vm files in the webapp directory. Not breaking for Jira itself (in theory).
com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult#getLicenseVersion()Use #getLicenseDetails().getLicenseVersion() instead.
com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult#getTotalUserCount()Use one of the following:
  • com.atlassian.jira.application.ApplicationAuthorizationService#getUserCount(ApplicationKey)
  • com.atlassian.jira.user.util.UserManager#getTotalUserCount()
com.atlassian.jira.bc.portal.PortalPageService#updatePortalPageUnconditionally(com.atlassian.jira.bc.JiraServiceContext, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.portal.PortalPage) removedUse one of the following:
  • #updatePortalPageOwner
  • #updatePortalPage
  • PortalPageManager#update
com.atlassian.jira.bc.project.version.VersionService#validateVersionDetails(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String, java.lang.String) removedUse #validateUpdate(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.bc.project.version.VersionService.VersionBuilder) instead.
com.atlassian.jira.bc.project.version.VersionService#validateReleaseDate(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String) removedUse #validateUpdate(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.bc.project.version.VersionService.VersionBuilder) instead.
com.atlassian.jira.bc.user.UserService#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser, com.atlassian.application.api.ApplicationKey) removedUse UserService#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.user.ApplicationUser,com.atlassian.application.api.ApplicationKey) instead.
com.atlassian.jira.bc.customfield.CustomFieldDefinition#CustomFieldDefinition() removedUse com.atlassian.jira.bc.customfield.CustomFieldDefinition#builder to construct the instance.
com.atlassian.jira.bc.issue.comment.CommentService#isGroupVisiblityEnabled() renamed to com.atlassian.jira.bc.issue.comment.CommentService#isGroupVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.comment.CommentService#isProjectVisiblityEnabled() renamed to com.atlassian.jira.bc.issue.comment.CommentService#isProjectRoleVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.comment.CommentService#isValidCommentData(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String, com.atlassian.jira.util.ErrorCollection) removedUse
#isValidCommentVisibility(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, com.atlassian.jira.bc.issue.visibility.Visibility, com.atlassian.jira.util.ErrorCollection) instead.
com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters#getGroupLevel() and
com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters#getRoleLevelId() removed
Use the method returning Visibility instance:
#getVisibility()
Example of use that returns io.atlassian.fugue.Option<String> instance with appropriate group level value:
getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())
com.atlassian.jira.bc.issue.util.VisibilityValidator#isProjectRoleVisiblityEnabled() renamed to #isProjectRoleVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.util.VisibilityValidator#isGroupVisiblityEnabled() renamed to #isGroupVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.util.VisibilityValidator#isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, java.lang.String, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String) removedUse #isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, String, com.atlassian.jira.issue.Issue, com.atlassian.jira.bc.issue.visibility.Visibility) instead.
com.atlassian.jira.bc.issue.worklog.WorklogInputParameters#getGroupLevel,
com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl#getGroupLevel,
com.atlassian.jira.bc.issue.worklog.WorklogInputParameters#getRoleLevelId,
com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl#getGroupLevel removed
Use the method returning Visibility instance:
#getVisibility()
Example of use that returns io.atlassian.fugue.Option<String> instance with appropriate group level value:
getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())
com.atlassian.jira.bulkedit.BulkOperationManager#getBulkOperations() removedUse getProgressAwareBulkOperations() instead.
com.atlassian.jira.bulkedit.BulkOperationManager#addBulkOperation(String, Class) removedUse addProgressAwareBulkOperation(String, Class) instead.
com.atlassian.jira.bulkedit.BulkOperationManager#getOperation(String) removedUse getProgressAwareOperation(String) instead.
com.atlassian.jira.bulkedit.operation.BulkOperation removedUse com.atlassian.jira.bulkedit.operation.ProgressAwareBulkOperation instead.
Removed deprecated audit REST API endpoints:
GET /rest/api/2/auditing/record
POST /rest/api/2/auditing/record

Use the new REST API endpoints instead:

  • GET /rest/auditing/1.0/events
  • GET /rest/auditing/1.0/configuration/coverage
  • GET /rest/auditing/1.0/configuration/retention
  • PUT /rest/auditing/1.0/configuration/retention/file

For more information about the API, refer to Audit log improvements for developers.

Removed deprecated audit API code:

  • com.atlassian.jira.auditing.AssociatedItem
  • com.atlassian.jira.auditing.ChangedValue
  • com.atlassian.jira.auditing.AuditingCategory
  • com.atlassian.jira.auditing.AuditingFilter
  • com.atlassian.jira.auditing.RecordRequest
  • com.atlassian.jira.auditing.AuditRecord

Use the new API code instead:

  • com.atlassian.audit.entity.AuditResource
  • com.atlassian.audit.entity.ChangedValue
  • com.atlassian.jira.auditing.AuditCategory (since Jira 8.12.2)
  • com.atlassian.audit.api.AuditQuery
  • com.atlassian.audit.entity.AuditEvent
  • com.atlassian.audit.entity.AuditEntity

For more information about this change, refer to Migrating to the new Jira audit log Java API.

com.atlassian.jira.issue.search.managers.IssueSearcherManager#getSearcherGroups(com.atlassian.jira.issue.search.SearchContext) removedThe com.atlassian.jira.issue.search.SearchContext parameter is no longer needed. Use #getSearcherGroups() instead.
com.atlassian.jira.issue.search.managers.SearchHandlerManager#getSearcherGroups(com.atlassian.jira.issue.search.SearchContext) removedThe com.atlassian.jira.issue.search.SearchContext parameter is no longer needed. Use #getSearcherGroups() instead.
com.atlassian.jira.issue.search.managers.SearchHandlerManager#getSearchersByClauseName(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.issue.search.SearchContext) removedThe com.atlassian.jira.issue.search.SearchContext parameter is no longer needed. Use #getSearchersByClauseName(com.atlassian.crowd.embedded.api.User,String) instead.
com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper#getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext)The com.atlassian.jira.issue.search.SearchContext parameter is no longer needed. Use #getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query) instead.
com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper#getAllNavigatorValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext) removedThe com.atlassian.jira.issue.search.SearchContext parameter is no longer needed. Use #getAllNavigatorValuesForMatchingClauses(ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query) instead.
com.atlassian.jira.issue.util.IssueUpdateBean#getUser() removedUse #getApplicationUser() instead.
com.atlassian.jira.jql.query.AbstractLocalDateOperatorQueryFactory removedUse com.atlassian.jira.jql.util.JqlLocalDateSupport#getLocalDatesFromQueryLiterals(java.util.List) instead.
com.atlassian.jira.jql.util.JqlIssueSupport#getIssues(java.lang.String, com.atlassian.jira.user.ApplicationUser) removedUse #getIssue(String,com.atlassian.jira.user.ApplicationUser) instead.
com.atlassian.jira.jql.util.JqlIssueSupport#getIssues(java.lang.String) removedUse #getIssue(String) instead.
com.atlassian.jira.license.LicenseDetails#getLicenseStatusMessage(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.user.util.UserManager) removedUse #getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager) instead.
com.atlassian.jira.license.LicenseDetails#getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper, com.atlassian.jira.web.util.OutlookDate, java.lang.String, com.atlassian.jira.user.util.UserManager) removedUse #getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager) instead.
com.atlassian.jira.license.LicenseDetails#isLicenseAlmostExpired() removedUse LicenseDetails#getMaintenanceExpiryDate directly.
com.atlassian.jira.bc.whitelist.WhitelistService removedUse com.atlassian.plugins.whitelist.WhitelistService and com.atlassian.plugins.whitelist.OutboundWhitelist instead.
com.atlassian.jira.bc.whitelist.WhitelistManager removedUse com.atlassian.plugins.whitelist.WhitelistService and com.atlassian.plugins.whitelist.OutboundWhitelist instead.
com.atlassian.jira.mention.MentionService#sendCommentMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.issue.comments.Comment) removedUse #sendCommentMentions(Set,ApplicationUser,Comment,Comment) instead.
com.atlassian.jira.mention.MentionService#sendIssueCreateMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue) removedUse #sendIssueCreateMentions(Set,ApplicationUser,Issue) instead.
com.atlassian.jira.mention.MentionService#sendIssueEditMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.comments.Comment) removedUse #sendIssueEditMentions(Set,ApplicationUser,Issue,Comment) instead.
com.atlassian.jira.plugin.keyboardshortcut.KeyboardShortcutManager#getActiveShortcuts() removedUse #listActiveShortcutsUniquePerContext instead.
com.atlassian.jira.plugin.webfragment.conditions.AbstractJiraPermissionCondition removedUse AbstractPermissionCondition instead.
com.atlassian.jira.plugin.webfragment.conditions.AbstractPermissionCondition removedUse AbstractProjectPermissionCondition instead.
com.atlassian.jira.project.type.ProjectTypesEnabledCondition removedNo replacement
com.atlassian.jira.permission.PermissionSchemeManager#getEntitiesByType(org.ofbiz.core.entity.GenericValue, com.atlassian.jira.security.plugin.ProjectPermissionKey, java.lang.String) removedUse #getPermissionSchemeEntries(long,com.atlassian.jira.security.plugin.ProjectPermissionKey,String) instead.
com.atlassian.jira.permission.PermissionSchemeManager#getGroups(java.lang.Long, com.atlassian.jira.project.Project) removedUse #getGroups(ProjectPermissionKey,Project) instead.

Disabling runtime JavaServer Pages compilation

removed Jira Software Jira Service Management

JavaServer Pages (JSP) runtime compilation will be disabled in Jira Software 10.0 and Jira Service Management 6.0. JSP files added to the Tomcat directory that aren't shipped with the product won’t be served. Furthermore, no modifications to the JSP files will be reflected. Use Soy or Velocity templates instead.

End of support for the H2 database engine

removed Jira Software Jira Service Management

To resolve several security vulnerabilities, the JDBC driver for the H2 database engine is no longer bundled with Jira Software 10.0 and Jira Service Management 6.0. This means that we’re removing it from the list of supported platforms. Additionally, you’ll no longer be able to evaluate Jira Software 10.0 and Jira Service Management 6.0 using H2.

Removal of dependencies

removed Jira Software

In the previous EAP, we’ve announced our plansto remove access to a number of dependencies from Jira Software 10.0, which are currently accessible in Jira Software 9.x. Those dependencies have been removed in EAP 03. Here's the complete list of what’s been removed:

DependencyJava packages
nekohtml:nekohtmlorg.cyberneko.html
org.cyberneko.html.*
commons-validator:commons-validatororg.apache.commons.validator
org.apache.commons.validator.*
com.atlassian.scala.plugins:scala-2.11-provider-pluginscala.*
com.atlassian.scala.plugins:scala-2.10-provider-pluginscala.*
com.atlassian.scala.plugins:jackson-module-scala-2.10-provider-plugincom.fasterxml.jackson.module.scala2_10
io.atlassian.fugue:fugue-scalaio.atlassian.fugue.converters
commons-daemon:commons-daemonorg.apache.commons.daemon.*
org.apache.tomcat:tomcat-coyoteorg.apache.coyote.*
commons-el:commons-elorg.apache.commons.el.*
org.apache.tomcat:tomcat-jasperorg.apache.jasper.*
org.apache.tomcat:tomcat-juliorg.apache.juli
org.apache.juli.logging
org.apache.tomcat:*org.apache.tomcat
org.apache.catalina
org.apache.tika:tika-core
org.apache.tika:tika-*
org.apache.tika
org.apache.tika.*
org.apache.xmlgraphics:batik-transcoder
org.apache.xmlgraphics:batik-codec
org.apache.xmlgraphics:batik-js
org.apache.xmlgraphics:batik-svggen
org.apache.xmlgraphics:fop
org.apache.batik
org.apache.batik.*
com.querydsl:querydsl-core
com.querydsl:querydsl-sql
com.mysema.commons.lang
com.querydsl.core
com.querydsl.core.*
commons-configuration:commons-configurationorg.apache.commons.configuration
org.apache.commons.configuration.beanutils
org.apache.commons:commons-collections4org.apache.commons.collections4
com.thoughtworks.xstream:xstreamcom.thoughtworks.xstream
com.thoughtworks.xstream.*
org.apache.commons:commons-dbcp2org.apache.commons.dbcp2
org.apache.commons.dbcp2.cpdsadapter
org.apache.commons.dbcp2.datasources
org.apache.commons.dbcp2.managed
com.sun.syndication:com.springsource.com.sun.syndicationcom.sun.syndication.feed.*
com.sun.syndication.io.*
rome:romecom.sun.syndication.feed.*
com.sun.syndication.io.*
commons-discovery:commons-discoveryorg.apache.commons.discover.jdk
org.apache.commons.discovery.*
commons-jexl:commons-jexlorg.apache.commons.jexl.*
commons-jrcs:commons-jrcsorg.apache.commons.jrcs.*
com.github.rholder:guava-retryingcom.github.rholder.retry.*
org.dom4j:dom4jorg.dom4j.*
opensymphony:sitemeshcom.opensymphony.module.*
com.opensymphony.sitemesh.*
org.jdom:jdomorg.jdom.*
commons-pool:commons-poolorg.apache.commons.pool.*
org.tuckey:urlrewritefilterorg.tuckey.web.filters.urlrewrite.*
org.springframework.security:spring-security-coreorg.springframework.security.*
com.atlassian.p4package:atlassian-p4packagecom.perforce.api
commons-beanutils:commons-beanutilsorg.apache.commons.beanutils
org.apache.commons.beanutils.*
org.apache.commons:comons-compressorg.apache.commons.compress
org.apache.commons.compress.*
com.sun:jai_corecom.sun.media.jai.*
javax.media.jai
javax.media.jai.*
com.sun:jai_codeccom.sun.media.jai.*
wsdl4j:wsdl4jcom.ibm.wsdl
com.ibm.wsdl.*
javax.wsdl
javax.wsdl.*

Removal of previously deprecated methods and classes

removed Jira Software Jira Service Management

In this EAP release, we’ve removed yet another set of methods and classes that have been deprecated since Jira Software 9.x and Jira Service Management 5.x.

Here’s what’s already been removed:

ChangeInstructions
com.atlassian.jira.bc.project.version.VersionService#delete(JiraServiceContext, ValidationResult)Use com.atlassian.jira.bc.project.version.VersionService#deleteVersionAndSwap instead.
com.atlassian.jira.bc.project.version.VersionService#deleteVersion(ApplicationUser, Version, Option<Version>, Option<Version>)Use com.atlassian.jira.project.version.VersionManager#deleteVersionAndSwap instead.
com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult#getLicenseVersion()Use #getLicenseDetails().getLicenseVersion() instead.
com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult#getTotalUserCount()Use one of the following:
  • com.atlassian.jira.application.ApplicationAuthorizationService#getUserCount(ApplicationKey)
  • com.atlassian.jira.user.util.UserManager#getTotalUserCount()
com.atlassian.jira.bc.portal.PortalPageService#updatePortalPageUnconditionally(com.atlassian.jira.bc.JiraServiceContext, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.portal.PortalPage)Use one of the following:
  • #updatePortalPageOwner
  • #updatePortalPage
  • PortalPageManager#update
com.atlassian.jira.bc.project.version.VersionService#validateVersionDetails(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String, java.lang.String)Use #validateUpdate(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.bc.project.version.VersionService.VersionBuilder) instead.
com.atlassian.jira.bc.project.version.VersionService#validateReleaseDate(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String)Use #validateUpdate(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.bc.project.version.VersionService.VersionBuilder) instead.
com.atlassian.jira.bc.user.UserService#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser, com.atlassian.application.api.ApplicationKey)Use UserService#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.user.ApplicationUser,com.atlassian.application.api.ApplicationKey) instead.
com.atlassian.jira.bc.customfield.CustomFieldDefinition#CustomFieldDefinition()Use com.atlassian.jira.bc.customfield.CustomFieldDefinition#builder to construct the instance.
com.atlassian.jira.bc.issue.comment.CommentService#isGroupVisiblityEnabled() renamed to com.atlassian.jira.bc.issue.comment.CommentService#isGroupVisibilityEnabled()Use method with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.comment.CommentService#isProjectVisiblityEnabled() renamed to com.atlassian.jira.bc.issue.comment.CommentService#isProjectRoleVisibilityEnabled()Use method with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters#getGroupLevel() and com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters#getRoleLevelId()Use the #getVisibility() method returning Visibility instance. Example of use that returns io.atlassian.fugue.Option<String> instance with appropriate group level value:
getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())
com.atlassian.jira.bc.issue.util.VisibilityValidator#isProjectRoleVisiblityEnabled() renamed to #isProjectRoleVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.util.VisibilityValidator#isGroupVisiblityEnabled() renamed to #isGroupVisibilityEnabled()Use methods with the visiblity typo corrected to visibility.
com.atlassian.jira.bc.issue.util.VisibilityValidator#isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, java.lang.String, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String)Use #isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, String, com.atlassian.jira.issue.Issue, com.atlassian.jira.bc.issue.visibility.Visibility) instead.

Removed:

  • com.atlassian.jira.bc.issue.worklog.WorklogInputParameters#getGroupLevel,
  • com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl#getGroupLevel
  • com.atlassian.jira.bc.issue.worklog.WorklogInputParameters#getRoleLevelId
  • com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl#getGroupLevel

Use the #getVisibility() method returning Visibility instance.

Example of use that returns io.atlassian.fugue.Option<String> instance with appropriate group level value:
getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())

com.atlassian.jira.bulkedit.BulkOperationManager#getBulkOperations()Use getProgressAwareBulkOperations() instead.
com.atlassian.jira.bulkedit.BulkOperationManager#addBulkOperation(String, Class)Use addProgressAwareBulkOperation(String, Class) instead.
com.atlassian.jira.bulkedit.BulkOperationManager#getOperation(String)Use getProgressAwareOperation(String) instead.
com.atlassian.jira.bulkedit.operation.BulkOperationUse com.atlassian.jira.bulkedit.operation.ProgressAwareBulkOperation instead.

Deprecated audit API code:

  • com.atlassian.jira.auditing.AssociatedItem
  • com.atlassian.jira.auditing.ChangedValue
  • com.atlassian.jira.auditing.AuditingCategory
  • com.atlassian.jira.auditing.AuditingFilter
  • com.atlassian.jira.auditing.RecordRequest
  • com.atlassian.jira.auditing.AuditRecord

Use the following API code instead:

  • com.atlassian.audit.entity.AuditResource
  • com.atlassian.audit.entity.ChangedValue
  • com.atlassian.jira.auditing.AuditCategory (since Jira 8.12.2)
  • com.atlassian.audit.api.AuditQuery
  • com.atlassian.audit.entity.AuditEvent
  • com.atlassian.audit.entity.AuditEntity

For more details, refer to the migration guide.

com.atlassian.jira.bc.whitelist.WhitelistServiceUse com.atlassian.plugins.whitelist.WhitelistService and com.atlassian.plugins.whitelist.OutboundWhitelist instead
com.atlassian.jira.bc.whitelist.WhitelistManager
com.atlassian.jira.issue.search.managers.IssueSearcherManager.getSearcherGroups(com.atlassian.jira.issue.search.SearchContext)Use #getSearcherGroups() instead.
com.atlassian.jira.issue.search.managers.SearchHandlerManager.getSearcherGroups(com.atlassian.jira.issue.search.SearchContext)Use #getSearcherGroups() instead.
com.atlassian.jira.issue.search.managers.SearchHandlerManager.getSearchersByClauseName(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.issue.search.SearchContext)Use #getSearchersByClauseName(com.atlassian.crowd.embedded.api.User,String) instead.
com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper.getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext)Use #getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query) instead.
com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper.getAllNavigatorValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext)Use #getAllNavigatorValuesForMatchingClauses(ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query) instead.
com.atlassian.jira.issue.util.IssueUpdateBean.getUser()Use #getApplicationUser() instead.
com.atlassian.jira.jql.query.AbstractLocalDateOperatorQueryFactoryUse com.atlassian.jira.jql.util.JqlLocalDateSupport#getLocalDatesFromQueryLiterals(java.util.List) instead.
com.atlassian.jira.jql.util.JqlIssueSupport.getIssues(java.lang.String)Use #getIssue(String) instead.
com.atlassian.jira.jql.util.JqlIssueSupport.getIssues(java.lang.String, com.atlassian.jira.user.ApplicationUser)Use #getIssue(String,com.atlassian.jira.user.ApplicationUser) instead.
com.atlassian.jira.license.LicenseDetails.getLicenseStatusMessage(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.user.util.UserManager)Use #getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager) instead.
com.atlassian.jira.license.LicenseDetails.getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper, com.atlassian.jira.web.util.OutlookDate, java.lang.String, com.atlassian.jira.user.util.UserManager)Use #getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager) instead.
com.atlassian.jira.license.LicenseDetails.isLicenseAlmostExpired()Use LicenseDetails#getMaintenanceExpiryDate instead.
com.atlassian.jira.mention.MentionService.sendCommentMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.issue.comments.Comment)Use #sendCommentMentions(Set,ApplicationUser,Comment,Comment) instead.
com.atlassian.jira.mention.MentionService.sendIssueCreateMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue)Use #sendIssueCreateMentions(Set,ApplicationUser,Issue) instead.
com.atlassian.jira.mention.MentionService.sendIssueEditMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.comments.Comment)Use #sendIssueEditMentions(Set,ApplicationUser,Issue,Comment) instead.
com.atlassian.jira.permission.PermissionSchemeManager.getEntitiesByType(org.ofbiz.core.entity.GenericValue, com.atlassian.jira.security.plugin.ProjectPermissionKey, java.lang.String)Use #getPermissionSchemeEntries(long,com.atlassian.jira.security.plugin.ProjectPermissionKey,String) instead.
com.atlassian.jira.permission.PermissionSchemeManager.getGroups(java.lang.Long, com.atlassian.jira.project.Project)Use #getGroups(ProjectPermissionKey,Project) instead.
com.atlassian.jira.plugin.keyboardshortcut.KeyboardShortcutManager.getActiveShortcuts()Use #listActiveShortcutsUniquePerContext instead.
com.atlassian.jira.plugin.webfragment.conditions.AbstractJiraPermissionConditionUse AbstractPermissionCondition instead.
com.atlassian.jira.plugin.webfragment.conditions.AbstractPermissionConditionUse AbstractProjectPermissionCondition instead.
com.atlassian.jira.project.type.ProjectTypesEnabledConditionNo replacement.

Here’s what you can expect us to remove in the future:

ChangeInstructions
com.atlassian.jira.auditing.AuditingManager#countRecordsUse com.atlassian.audit.api.AuditSearchService#count instead.
com.atlassian.jira.auditing.AuditingManager#getRecordsUse com.atlassian.audit.api.AuditSearchService#findBy or com.atlassian.audit.api.AuditSearchService#stream instead.
com.atlassian.jira.auditing.AuditingManager#storeUse com.atlassian.audit.api.AuditService#audit instead.
com.atlassian.jira.auditing.AuditingService#getRecordsUse com.atlassian.audit.api.AuditSearchService#findBy or com.atlassian.audit.api.AuditSearchService#stream instead.
com.atlassian.jira.auditing.AuditingService#getTotalNumberOfRecordsUse com.atlassian.audit.api.AuditSearchService#count instead.
com.atlassian.jira.auditing.AuditingService#storeRecordUse com.atlassian.audit.api.AuditService#audit instead.
com.atlassian.jira.auditing.Records.getRecords()Use #getResults instead.
com.atlassian.jira.bc.issue.comment.CommentService.isGroupVisiblityEnabled()Use #isGroupVisibilityEnabled() instead.
com.atlassian.jira.bc.issue.comment.CommentService.isProjectRoleVisiblityEnabled()Use #isProjectRoleVisibilityEnabled() instead.
com.atlassian.jira.bc.issue.comment.CommentService.isValidCommentData(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String, com.atlassian.jira.util.ErrorCollection)Use #isValidCommentVisibility(ApplicationUser,Issue,com.atlassian.jira.bc.issue.visibility.Visibility,ErrorCollection) instead.
com.atlassian.jira.config.ConstantsManager.storeIssueTypes(java.util.List<org.ofbiz.core.entity.GenericValue>)Use #updateIssueType(String,String,Long,String,String,Long) or #recalculateIssueTypeSequencesAndStore(java.util.List) instead.
com.atlassian.jira.config.properties.LookAndFeelBean.getVersion()Use #getSettingsHash() instead.
com.atlassian.jira.config.properties.LookAndFeelBean.updateVersion(long)Use #updateSettingsHash() instead.
com.atlassian.jira.config.SubTaskManager.insertSubTaskIssueType(java.lang.String, java.lang.Long, java.lang.String, java.lang.String)Use #insertSubTaskIssueType(String,Long,String,Long) instead.
com.atlassian.jira.config.SubTaskManager.updateSubTaskIssueType(java.lang.String, java.lang.String, java.lang.Long, java.lang.String, java.lang.String)Use #updateSubTaskIssueType(String,String,Long,String,Long) instead.
com.atlassian.jira.event.issue.IssueWatcherAddedEvent.getUser()Use #getApplicationUser() instead.
com.atlassian.jira.event.issue.IssueWatcherDeletedEvent.getUser()Use #getApplicationUser() instead.
com.atlassian.jira.event.mail.EmailQueueFlashedEventUse EmailQueueFlushedEvent instead.
com.atlassian.jira.help.HelpUrlsParser.defaultUrl(java.lang.String, java.lang.String)Use HelpUrlsParserBuilderFactory instead.
com.atlassian.jira.help.HelpUrlsParser.onDemand(boolean)Use HelpUrlsParserBuilderFactory instead.
com.atlassian.jira.imports.project.mapper.ProjectImportIdMapper.getValuesFromImport()Use getRegisteredOldIds() instead.
com.atlassian.jira.imports.project.mapper.ProjectRoleActorMapper.getAllProjectRoleActors()Use the properly typed method #getProjectRoleActors() instead.
com.atlassian.jira.issue.comments.CommentManager.getProjectRole(java.lang.Long)Use com.atlassian.jira.security.roles.ProjectRoleManager#getProjectRole(Long) instead.
com.atlassian.jira.issue.customfields.CustomFieldType.getNonnullCustomFieldProvider()Use #getNonNullCustomFieldProvider() instead.
com.atlassian.jira.issue.customfields.vdi.NonNullCustomFieldProvider.getCustomFieldInfo(com.atlassian.jira.issue.Issue)Use getCustomFieldInfo(List issues) instead.
com.atlassian.jira.issue.fields.layout.field.FieldLayoutStorageExceptionNo replacement
com.atlassian.jira.issue.fields.rest.json.CommentBeanFactory.createRenderedBean(com.atlassian.jira.issue.comments.Comment)Use #createRenderedBean(com.atlassian.jira.issue.comments.Comment) instead.
com.atlassian.jira.issue.index.ReindexAllCompletedEvent.shouldUpdateReplicatedIndex()Use #shouldNotifyCluster() instead.
com.atlassian.jira.issue.index.ReindexAllStartedEvent.shouldUpdateReplicatedIndex()Use #shouldNotifyCluster() instead.
com.atlassian.jira.scheme.SchemeManager.createScheme(java.lang.String, java.lang.String)Use #createSchemeObject(String,String) instead.
com.atlassian.jira.scheme.SchemeManager.getGroups(java.lang.Long, org.ofbiz.core.entity.GenericValue)Use #getGroups(Long,com.atlassian.jira.project.Project) instead.
com.atlassian.jira.security.GlobalPermissionEntry.getGlobalPermissionType()Use #getPermissionKey() instead.
com.atlassian.jira.security.JiraAuthenticationContext.getI18nBean()Use #getI18nHelper() instead.
com.atlassian.jira.security.JiraAuthenticationContext.getText(java.lang.String)Use getText() method on #getI18nHelper() instead.
com.atlassian.jira.sharing.ShareManager.hasPermission(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.sharing.SharedEntity)Use #isSharedWith(com.atlassian.crowd.embedded.api.User,SharedEntity) instead.
com.atlassian.jira.user.preferences.JiraUserPreferences.JiraUserPreferences()You shouldn’t construct user preferences directly. Request them through the UserPreferencesManager instead.
com.atlassian.jira.util.collect.MapBuilder.toFastMap()Use ImmutableMap directly instead.
com.atlassian.jira.util.collect.MapBuilder.toImmutableMap()Use #toMap() instead. or consider using ImmutableMap if the map doesn’t need to accept null values.
com.atlassian.jira.util.index.Contexts.nullContext()Use #com.atlassian.jira.task.context.Contexts#nullContext() instead.
com.atlassian.jira.util.JiraDurationUtils.onClearCache(com.atlassian.jira.event.ClearCacheEvent)Use #DurationFormatChanged instead.
com.atlassian.jira.util.JiraDurationUtils.start()No replacement
com.atlassian.jira.web.action.issue.IssueCreationHelperBean.getProvidedFieldNames(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue)Use #getProvidedFieldNames(com.atlassian.jira.issue.Issue) instead.
com.atlassian.jira.web.bean.MultiBulkMoveBean.setTargetProject(org.ofbiz.core.entity.GenericValue)Use #setTargetProject(com.atlassian.jira.project.Project) instead.
com.atlassian.jira.web.util.HelpUtil.HelpPath.getSimpleUrl()Use #getUrl() instead.
com.atlassian.jira.web.util.OutlookDate.format()Use #com.atlassian.jira.datetime.DateTimeFormatter#format(java.util.Date) instead.
com.atlassian.jira.web.util.OutlookDate.getCompleteDateFormat()Use #com.atlassian.jira.datetime.DateTimeFormatter#getFormatHint() instead.
com.atlassian.jira.web.util.OutlookDate.getDatePickerFormat()Use #com.atlassian.jira.datetime.DateTimeFormatter#getFormatHint() instead.
com.atlassian.jira.web.util.OutlookDate.getDateTimePickerFormat()Use #com.atlassian.jira.datetime.DateTimeFormatter#getFormatHint() instead.
com.atlassian.jira.web.util.OutlookDate.getNow()Use java.util.Date#Date() instead.
com.atlassian.jira.bc.user.search.UserSearchParams : everything related to maxResultsUse limit instead.
com.atlassian.jira.util.collect.CollectionUtil#filter(Collection<T>, Predicate<? super T>)Use com.atlassian.jira.util.collect.CollectionUtil#filter(java.lang.Iterable<T>, com.atlassian.jira.util.Predicate<? super T>) or <br>com.google.common.collect.Collections2#filter if you need to keep the same behavior.
com.atlassian.jira.permission.SchemePermissionsUse com.atlassian.jira.security.PermissionManager
com.atlassian.jira.permission.PermissionUse com.atlassian.jira.security.PermissionManager or com.atlassian.jira.security.GlobalPermissionManager
com.atlassian.jira.issue.attachment.AttachmentZipKitUse com.atlassian.jira.issue.AttachmentIndexManager
com.atlassian.jira.util.NotNull (annotation)Use javax.annotation.Nonnull

The getProjects(int, com.atlassian.jira.user.ApplicationUser) method signature from:

  • com.atlassian.jira.security.PermissionManager
  • com.atlassian.jira.security.PublicAccessPermissionManager
  • com.atlassian.jira.security.ApplicationRequiredPermissionManager
  • com.atlassian.jira.security.DefaultPermissionManager
  • com.atlassian.jira.security.SubvertedPermissionManager
Use the supported getProjects method. For example:
  • com.atlassian.jira.security.PermissionManager#getProjects(com.atlassian.jira.security.plugin.ProjectPermissionKey
  • com.atlassian.jira.user.ApplicationUser)
  • com.atlassian.jira.security.PermissionManager#getProjects(com.atlassian.jira.security.plugin.ProjectPermissionKey
  • com.atlassian.jira.user.ApplicationUser
  • com.atlassian.jira.project.ProjectCategory)

Removal of previously deprecated REST API endpoints

removed Jira Software Jira Service Management

In this EAP release, we’ve removed yet another set of REST API endpoints that have been deprecated since Jira Software 9.x and Jira Service Management 5.x.

Here’s what’s been removed:

ChangeInstructions

Removed deprecated audit REST API endpoints:

  • GET /rest/api/2/auditing/record
  • POST /rest/api/2/auditing/record

Use the new REST API endpoints instead:

  • GET /rest/auditing/1.0/events
  • GET /rest/auditing/1.0/configuration/coverage
  • GET /rest/auditing/1.0/configuration/retention
  • GET /rest/auditing/1.0/configuration/retention/file
Removed public endpoint GET /rest/api/2/group provided by com.atlassian.jira.rest.v2.issue.GroupResource#getGroupUse GET /rest/api/2/group/member provided by com.atlassian.jira.rest.v2.issue.GroupResource#getUsersFromGroup.
Removed public endpoint DELETE /rest/api/2/version/{id} provided by com.atlassian.jira.rest.v2.issue.VersionResource#delete(java.lang.String, java.lang.String, java.lang.String)Use POST /rest/api/2/version/{id}/removeAndSwap provided by com.atlassian.jira.rest.v2.issue.VersionResource#delete(String, DeleteAndReplaceVersionBean).

Note that the replacement endpoint doesn't publish the jira:version_merged webhook event.

Here’s what we’re planning to remove in the future:

ChangeInstructions
The api/1.0/users/picker and api/1.0/users/picker/filter endpoints provided by com.atlassian.jira.rest.v1.users.UserPickerResourceUse api/2/groupuserpicker provided by com.atlassian.jira.rest.v2.issue.GroupAndUserPickerResource instead.
Private endpoint GET globalconfig/1/issuecustomfields/{issue} provided by com.atlassian.jira.projectconfig.rest.global.IssueCustomFieldsResource#getAffectedProjectsNo replacement
Private endpoint POST globalconfig/1/customfieldoptions/{customFieldId}/ provided by com.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsUse POST globalconfig/1/customfieldoptions/{customFieldId} provided by com.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsForCustomField.
Private endpoint POST /api/1.0/user/{username}/avatar/{avatarid} provided by com.atlassian.jira.rest.v1.users.UserResourceReplace with PUT /rest/api/2/user/avatar provided by com.atlassian.jira.rest.v2.issue.UserResource#updateUserAvatar.
Private endpoint /greenhopper/1.0/api/sprints/{sprintId}/remotelink provided by com.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createOrUpdateRemoteSprintLinkUse greenhopper/1.0/api/sprints/{sprintId}/remotelinkchecked provided by com.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createRemoteSprintLinkChecked.

Unbundling of atlassian-frontend-runtime-plugin

removed Jira Software

The atlassian-frontend-runtime-plugin provided common polyfills and the regenerator-runtime web resource. Since none of the supported browsers need these polyfills any longer and the plugin has been deprecated since Jira Software 9.2.0, it’ll be removed in Jira Software 10.0.

If your code is still using any web resources from this plugin, the following warnings may appear in in Jira logs:

1
2
This webresource is empty! All supported browsers no longer need these polyfills. Please remove your dependency on the "atlassian-frontend-runtime-plugin".
1
2
This webresource is deprecated and will soon be removed! All supported browsers no longer need the runtime. Please rebuild your sources without expecting the "regenerator-runtime" to be available.

The former babel-polyfill, core-js, custom-elements-v1, fetch, and focus-visible were already empty web resources, while the regenerator-runtime was still provided.

All instances of AUI Dialog 1 migrated to AUI Dialog 2

deprecated Jira Software Jira Service Management

This change is still a work in progress.

We’re working on migrating all of the instances of the deprecated AUI Dialog 1 remaining throughout Jira Core and Jira Software to AUI Dialog 2.

We’re also planning to remove the following web resources as part of this work:

  • com.atlassian.auiplugin:dialog
  • jira.webresources:jira-accessible-dialog

Deprecated and removed feature flags

deprecated Jira Service Management

In this EAP release, we’ve removed the jira.users.and.roles.page.in.react feature flag.

The following feature flags have been deprecated and are marked for removal in an upcoming EAP release of Jira Software 10.0 and Jira Service Management 6.0:

  • jira.quick.search
  • com.atlassian.jira.custom.csv.escaper
  • atlassian.cdn.static.assets
  • com.atlassian.jira.agile.darkfeature.burnupchart
  • optimistic.transitions
  • com.atlassian.jira.advanced.audit.log
  • velocity.chart.ui

Deprecation of http-builder from the JSM package

deprecated Jira Service Management

The http-builder library is no longer actively maintained and it’ll be removed from Jira Service Management 6.0. If you’re using this library in your Groovy scripts, we recommend that you switch to the native Groovy GET and POST methods.

Deprecation of jquery-migrate 1.x

deprecated Jira Software

We’re planning to upgrade jQuery and as part of that effort, we’ll also deprecate jquery-migrate 1.x in Jira Software 10.0 to remove it entirely in the next feature release.

Jira Software 10.0 won’t contain the upgraded jQuery and will be focused mainly around the deprecation of jquery-migrate 1.x and its removal from the superbatch Web Resource.

While jquery-migrate can still be loaded using certain Web Resource Keys (such as com.atlassian.plugins.jquery:jquery or com.atlassian.plugins.jquery:jquery-migrate), we advise against this.

For more information on the deprecation of jquery-migrate 1.x, visit the jQuery Upgrade Guide. For queries about jquery-migrate 1.x warnings, refer to jQuery Migrate Warnings. For future jQuery updates, refer to the 3.0 and 3.5 Upgrade Guides.

Changes introduced in EAP 02 (27 March 2024)

For more details about what’s in scope of this EAP release, check out the following updates:

Centralized dependency management

added Jira Software

Centralized dependency management in Jira Software 10 introduces a set of Maven POM files known as a Bill of Materials (BOM), which list the dependencies available to third-party apps.

This system aims to streamline responding to security threats and enhance efficiency of developing for Jira by ensuring that dependencies are uniform and up-to-date. This approach minimizes runtime errors such as NoSuchMethodException and allows for quicker responses to security vulnerabilities within these dependencies.

There are multiple BOM files, each serving different functions:

  • jira-api-bom: This BOM is designed for external products. It offers a centralized location for managing the dependencies of external products, ensuring that they’re using the correct, up-to-date versions of dependencies.
  • jira-deprecated-api-bom: This BOM lists libraries that may undergo changes or be removed from the public Bill of Materials in future updates.
  • jira-internal-bom: This BOM is intended for internal products. It provides a centralized location for managing internal dependencies, ensuring consistency across all internal products.
  • jira-bundled-plugins-bom: This BOM manages the versions of apps bundled with Jira.

Using artifacts for version management

BOMs (Bill of Materials) are Maven modules of the pom packaging type, which are designed to facilitate the management of imported dependencies as detailed in the Maven documentation.

Each BOM contains dependency management sections rather than direct dependencies. To use a BOM, you should first include it as a dependency with the import scope. For example:

1
2
<dependency>
    <groupId>com.atlassian.jira</groupId>
    <artifactId>jira-api-bom</artifactId>
    <version>${jira.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

Subsequently, other dependencies should be explicitly defined manually with the scope provided, omitting version specifications. The versions will be configured through the imported BOM artifacts. For example:

1
2
<dependency>
    <groupId>com.atlassian.security</groupId>
    <artifactId>atlassian-secure-utils</artifactId>
    <scope>provided</scope>
</dependency>

Adopting centralized BOMs in App Development

To adopt centralised BOMs, follow these steps:

  1. Remove the jira-project dependency management import.
  2. Add jira-api-bom as a dependency with scope import.
  3. Consider adding jira-deprecated-api-bom if needed, but note that these dependencies are marked as deprecated and will be removed in future versions.
  4. Remove redundant dependency management sections from your poms (for artefacts covered by the bom)
  5. Since BOM does not define scope, if your dependency management section used to contain scope definition, you must now add it to the actual dependency declaration.
  6. Conduct deep analysis of the dependency tree to ensure all dependencies are correctly managed, and no discrepancies exist between versions. All dependencies listed in the bom files
  7. Ensure that dependencies, especially those in the provided scope, don't have a version field to allow the central pom to define it. This ensures consistency and prevents runtime issues.

Jira Software Data Center is migrated and fully exposes RESTv2

added Jira Software

For more information, check out the RESTv2 migration guide.

Breaking changes to the Java and REST APIs in EAP02

removed Jira Software

We’ve removed access to a number of dependencies from Jira Software 10.0 and Jira Service Management 6.0, which are currently accessible in Jira Software 9.x:

ChangeInstructionsImplemented
Deprecated com.atlassian.jira.issue.table.IssueTable provided by jira-api removedUse com.atlassian.jira.issue.table.IssueTable provided by jira-issue-nav-plugin instead.

Removed:

  • com.atlassian.jira.rest.Dates.DateAdapter
  • com.atlassian.jira.rest.Dates.DateTimeAdapter
For marshalling and unmarshalling, use the Jackson-friendly serializers and deserializers:
  • @JsonSerialize(using = Dates.DateSerializer.class)
  • @JsonDeserialize(using = Dates.DateDeserializer.class)
Removed com.atlassian.jira:jira-func-tests-legacyMigrate your code from BaseJIRAWebTest (Junit3) to FuncTestCase (Junit 4+). This module has been deprecated since Jira 7.
The doHealthCheck request parameter was removed from the rest/api/2/serverInfo endpoint together with the healthChecks field from the response.Use jira-healthcheck-plugin instead.
Removed rest/api/1.0/endpointNo alternative provided.

Removed:

  • com.atlassian.jira.rest.v2.issue.project.ProjectRoleBean
  • com.atlassian.jira.rest.v2.issue.project.RoleActorBean

Instead, use:

  • com.atlassian.jira.rest.api.project.ProjectRoleBean
  • com.atlassian.jira.rest.api.project.RoleActorBean
Removed com.atlassian.jira.rest.v1.model.ValueCollectionNo alternative provided.
  • com.atlassian.jira.testkit.client.restclient.Response class of jira-testkit-client has been deprecated
  • com.atlassian.jira.testkit.client.RestApiClient.toResponse(...) accepts RestCall functional interface
Use com.atlassian.jira.testkit.client.restclient.ParsedResponse

Use new RestCall interface or lambda in place of method interface instead.
Jira table column update for Oracle and Mysql.No actions required, schema will be migrated on restart.

Impacted tables include: changegroup jiraissue jiraaction
com.atlassian.jira.avatar.AvatarManager
#getAvatarBaseDirectory
Use AvatarManager#readAvatarData() to access avatar data directly.

Planned removal of deprecated dependencies

deprecated Jira Software

We’re planning to remove access to a number of dependencies from Jira Software 10.0, which are currently accessible in Jira 9.x:

DependencyJava packages
nekohtml:nekohtml
  • org.cyberneko.html
  • org.cyberneko.html.*
commons-validator:commons-validator
  • org.apache.commons.validator
  • org.apache.commons.validator.*
com.atlassian.scala.plugins:scala-2.11-provider-pluginscala.*
com.atlassian.scala.plugins:scala-2.10-provider-pluginscala.*
com.atlassian.scala.plugins:jackson-module-scala-2.10-provider-plugincom.fasterxml.jackson.module.scala2_10
io.atlassian.fugue:fugue-scalaio.atlassian.fugue.converters
commons-daemon:commons-daemonorg.apache.commons.daemon.*
org.apache.tomcat:tomcat-coyoteorg.apache.coyote.*
commons-el:commons-elorg.apache.commons.el.*
org.apache.tomcat:tomcat-jasperorg.apache.jasper.*
org.apache.tomcat:tomcat-juli
  • org.apache.juli
  • org.apache.juli.logging
org.apache.tomcat:*
  • org.apache.tomcat
  • org.apache.catalina
org.apache.tika:tika-core

org.apache.tika:tika-*
  • org.apache.tika
  • org.apache.tika.*
org.apache.xmlgraphics:batik-transcoder

org.apache.xmlgraphics:batik-codec

org.apache.xmlgraphics:batik-js

org.apache.xmlgraphics:batik-svggen

org.apache.xmlgraphics:fop
  • org.apache.batik
  • org.apache.batik.*
com.querydsl:querydsl-core

com.querydsl:querydsl-sql
  • com.mysema.commons.lang
  • com.querydsl.core
  • com.querydsl.core.*
commons-configuration:commons-configuration
  • org.apache.commons.configuration
  • org.apache.commons.configuration.beanutils
org.apache.commons:commons-collections4org.apache.commons.collections4
com.thoughtworks.xstream:xstream
  • com.thoughtworks.xstream
  • com.thoughtworks.xstream.*
org.apache.commons:commons-dbcp2
  • org.apache.commons.dbcp2
  • org.apache.commons.dbcp2.cpdsadapter
  • org.apache.commons.dbcp2.datasources
  • org.apache.commons.dbcp2.managed
com.sun.syndication:com.springsource.com.sun.syndication
  • com.sun.syndication.feed.*
  • com.sun.syndication.io.*
rome:rome
  • com.sun.syndication.feed.*
  • com.sun.syndication.io.*
commons-discovery:commons-discovery
  • org.apache.commons.discover.jdk
  • org.apache.commons.discovery.*
commons-jexl:commons-jexlorg.apache.commons.jexl.*
commons-jrcs:commons-jrcsorg.apache.commons.jrcs.*
com.github.rholder:guava-retryingcom.github.rholder.retry.*
org.dom4j:dom4jorg.dom4j.*
opensymphony:sitemesh
  • com.opensymphony.module.*
  • com.opensymphony.sitemesh.*
org.jdom:jdomorg.jdom.*
commons-pool:commons-poolorg.apache.commons.pool.*
org.tuckey:urlrewritefilterorg.tuckey.web.filters.urlrewrite.*
org.springframework.security:spring-security-coreorg.springframework.security.*
com.atlassian.p4package:atlassian-p4packagecom.perforce.api
commons-beanutils:commons-beanutils
  • org.apache.commons.beanutils
  • org.apache.commons.beanutils.*
org.apache.commons:comons-compress
  • org.apache.commons.compress
  • org.apache.commons.compress.*
com.sun:jai_core
  • com.sun.media.jai.*
  • javax.media.jai
  • javax.media.jai.*
com.sun:jai_codeccom.sun.media.jai.*
wsdl4j:wsdl4j
  • com.ibm.wsdl
  • com.ibm.wsdl.*
  • javax.wsdl
  • javax.wsdl.*

Rate this page: