As a major release, Jira 10.0 introduces backward-incompatible changes to the apps' API. If you build custom in-house apps, you need to test their compatibility and update them.
If you have installed apps from the Atlassian marketplace or another source, you also need to check their compatibility and update them before performing the upgrade. To check app compatibility, visit Checking app compatibility with application updates or the Atlassian Marketplace to see if your app hosting is compatible with your product version.
Â
Front-end API changes
This release brings an improved and updated Code sharing section of the Jira Data Center front-end API. We’ve introduced the following changes:
Inclusion of Jira-specific API modules, such as requested Jira Events.
Extensions and updates to common libraries.
Introduction to particular versioning of common libraries and alias module type.
Annotations to modules on the UPM level and better descriptions in the code.
Regular modules for the common libraries are versioned up to the minor version (x.y), for example, under the jira-frontend-api:react-18.3 web-resource Jira provides React 18.3.1, as of now. The patch version (aka bug fix) can be changed at any time, for example, the same web-resource can provide React 18.3.2 in the future.
The alias modules are versioned up to the major version (x), for example, under the jira-frontend-api:react-18 web-resource Jira provides React 18.3.1, as of now. The minor version can be changed at any time, for example, the same web-resource can provide React 18.4.0 in the future.
Dependency
Change
Rationale
jira-frontend-api:jquery-2.2.4
Deprecated. Use jira-frontend-api:jquery (jira/api/jquery AMD) instead.
Jira provides and supports the single jQuery version only. It can also be modified by Atlassian to include certain fixes. This is why the version has been dropped from the web-resource key. It’ll also make the migration to newer versions easier.
jira-frontend-api:underscore-1.8
Deprecated. Use jira-frontend-api:underscore-1.13 (jira/api/underscore-1.13 AMD) instead.
The recommended underscorejs version is the newest available one as of now (1.13.6).
The full list of available modules:
Dependency
AMD module
Rationale
Jira-specific
jira-frontend-api:almond
n/a
Provides AMD support by exposing define and require global functions. You don’t typically need to depend on Almond as it’s provided by default. However, it may be required if you build the custom page.
jira-frontend-api:version
jira/api/version
The module allows to #get the current Jira version, as well as #compare and #isGreaterThanOrEqualTo the current Jira version with a provided one.
jira-frontend-api:jira-events
jira/api/events
jira/api/events/reasons
jira/api/events/types
Provides Jira-namespaced event bus.
Provides a dictionary of reasons for events being triggered in Jira, such as panelRefreshed.
Provides a dictionary of event types, such as NEW_CONTENT_ADDED.
Common libraries
jira-frontend-api:jquery
jira/api/jquery
Provides jQuery used across Jira.
Current version: 2.2.4 with patches
jira-frontend-api:underscore-1.13
jira/api/underscore-1.13
Provides Underscore 1.13.x.
Current version: 1.13.6.
jira-frontend-api:backbone-1.6
jira/api/backbone-1.6
Provides Backbone.js 1.6.x.
Current version: 1.6.0.
jira-frontend-api:react-18.3
jira/api/react-18.3
Alias module. Provides React 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18.3
jira/api/react-dom-18.3
Provides React-DOM 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18
jira/api/react-dom-18
Alias module. Provides React-DOM 18.3.x.
Current version: 18.3.1.
Common libraries (deprecated)
jira-frontend-api:jquery-2.2.4
jira/api/jquery-2.2.4
Deprecated. Use jira-frontend-api:jquery (jira/api/jquery AMD) instead
jira-frontend-api:underscore-1.8
jira/api/underscore-1.8
Deprecated. Use jira-frontend-api:underscore-1.13 (jira/api/underscore-1.13 AMD) instead.
jira-frontend-api:react-16
jira/api/react-16.8
Deprecated. Use jira-frontend-api:react-18.3 (jira/api/react-18.3 AMD) instead.
Provides React 16.8.x.
Current version: 16.8.6.
jira/api/react-16
Deprecated. Use jira-frontend-api:react-18 (jira/api/react-18 AMD) instead.
Alias module. Provides React 16.x.
Current version: 16.8.6.
jira-frontend-api:react-dom-16
jira/api/react-dom-16.8
Deprecated. Use jira-frontend-api:react-dom-18.3 (jira/api/react-dom-18.3 AMD) instead.
Provides React-DOM 16.8.x.
Current version: 16.8.6.
jira/api/react-dom-16
Deprecated. Use jira-frontend-api:react-dom-18 (jira/api/react-dom-18 AMD) instead.
Alias module. Provides React-DOM 16.x.
Current version: 16.8.6.
OpenAPI standard for REST API documentation
REST API documentation for Jira Core and Jira Software is now available in an OpenAPI standard with a refreshed graphical form. This is the first time REST API documentation for Jira Core and Jira Software is no longer split. What’s more, we’ve reviewed and updated the documentation content. Get started with REST API documentation for Jira
Removal of previously deprecated feature flags
In this release, we’ve removed the following feature flags:
All features previously hidden behind those feature flags were enabled by default.
Breaking changes to the Java API
In this release, we've removed several deprecated methods and classes. Additionally, we’ve made adjustments to a group of methods which involved modifying the signatures and return types.
Use #getCustomFieldInfo(java.util.List issues) instead.
You now need to implement #getCustomFieldInfo(java.util.List<com.atlassian.jira.issue.Issue> issues) in every class you were previously implementing #getCustomFieldInfo(com.atlassian.jira.issue.Issue issue).
Use #addIndex(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData) instead.
Use #addDocumentFieldsNotSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData) instead.
Use #addDocumentFieldsSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData) instead.
Use #isSharedWith(com.atlassian.crowd.embedded.api.User, SharedEntity) to get the same logic. Permission checks should be done in the service layer according to this information.
Avoid using IssueCreationHelperBean class as it’ll be removed. Before it happens, use #getProvidedFieldNames(com.atlassian.jira.issue.Issue) instead.
Use #createRenderedBean(com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.util.EmailFormatter) instead.
Use #validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.user.ApplicationUser,com.atlassian.application.api.ApplicationKey) instead.
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())
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() removed.
Use #getProgressAwareBulkOperations() instead.
com.atlassian.jira.bulkedit.BulkOperationManager
#addBulkOperation(String, Class) removed.
Use #addProgressAwareBulkOperation(String, Class) instead.
Use #getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query) instead.
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.
Instead of getTemporaryAttachmentDirectory(), use AttachmentConfigManager#getTemporaryAttachmentDirectory().
Instead of getAttachmentFile and getThumbnailFile methods, use AttachmentManager and ThumbnalManager. For example AttachmentManager#streamAttachmentContent.
The following checks can be omitted: checkValidAttachmentDirectory and checkValidTemporaryAttachmentDirectory. Jira checks the validity of paths during startup.
AttachmentManager
#attachmentsEnabled() removed.
Use AttachmentConfigManager#isAttachmentsEnabled() instead.
AttachmentManager
#disableAttachments() removed.
No replacement.
AttachmentManager
#createAttachmentCopySourceFile and previously deprecated overloads of #createAttachment removed.
Use #createAttachment(CreateAttachmentParamsBean) instead.
Use the methods available in AttachmentManager to create/read/delete attachment data directly. For the settings related methods, use the new endpoints provided in AttachmentConfigManager.
Use com.atlassian.jira.functest.framework.backdoor.AttachmentFileControl in jira-func-tests (which requires the jira-func-test-plugin to be installed). It provides storage-agnostic alternative methods to allow copying and clearing attachments.
In this release, we’ve removed a set of REST API endpoints that have been deprecated since Jira Software 9.x.
Here’s what’s been changed:
Change
Instructions
Removed private endpoint POST /api/1.0/user/{username}/avatar/{avatarid} provided by com.atlassian.jira.rest.v1.users.UserResource
Use PUT /rest/api/2/user/avatar provided by com.atlassian.jira.rest.v2.issue.UserResource#updateUserAvatar instead.
Removed private endpoint GET globalconfig/1/issuecustomfields/{issue} provided by com.atlassian.jira.projectconfig.rest.global.IssueCustomFieldsResource#getAffectedProjects
No replacement.
Removed private endpoint POST globalconfig/1/customfieldoptions/{customFieldId}/ provided by com.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptions
Use POST globalconfig/1/customfieldoptions/{customFieldId}/setOptions provided by com.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsForCustomField instead.
/greenhopper/1.0/api/sprints/{sprintId}/remotelink provided by com.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createOrUpdateRemoteSprintLink
Use greenhopper/1.0/api/sprints/{sprintId}/remotelinkchecked provided by com.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createRemoteSprintLinkChecked instead.
Removed public endpoints:
GETÂ /rest/api/2/auditing/record
POSTÂ /rest/api/2/auditing/record
Use the following 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#getGroup
Use 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.
JIRA SERVICE MANAGEMENT Removed GET /servicedeskapi/queues/{projectKey}
Use GET /servicedeskapi/admin/queues/{projectKey} instead.
JIRA SERVICE MANAGEMENT Removed PUT /servicedeskapi/queues/include-count
Use PUT /servicedeskapi/admin/queues/include-count instead.
JIRA SERVICE MANAGEMENT Removed PUT /servicedeskapi/queues/{projectKey}/include-count
Â
Use PUT /servicedeskapi/admin/queues/{projectKey}/include-count instead.
JIRA SERVICE MANAGEMENT Removed PUT /servicedeskapi/queues/cache-count
Use PUT /servicedeskapi/admin/queues/cache-count instead.
JIRA SERVICE MANAGEMENTRemoved PUT /servicedeskapi/queues/{projectKey}/cache-count
Use PUT /servicedeskapi/admin/queues/{projectKey}/cache-count instead.
The GET rest/api/2/serverInfo endpoint no longer supports the doHealthCheck parameter and does not include the healthChecks field in the response.
Use jira-healthcheck-plugin instead.
Removed GET rest/api/1.0/endpoint
Â
Removal of dependencies
In this release, we’ve removed access to a number of dependencies.
Starting from Jira 10.0, the .bin and .exe installers will no longer be available. You can still install Jira using the .zip and .tar.gz distributions.
Jira Software and Jira Core dialogs migrated to AUI Dialog 2
This is still a work in progress. You can expect to see the full removal of AUI Dialog 1 from the Jira codebase by the upcoming LTS release.
Jira Software and Jira Core currently stand with significant majority of the components migrated to use AUI Dialog 2. AUI Dialog 1 will be removed from Jira completely by the upcoming LTS release. If your app uses that component, make sure to migrate to AUI Dialog 2.
Application Links compatibility
Starting from Jira 10.0, Application Links are only backward-compatible with products that have integrated a particular bug fix addressing incorrect Application Links version parsing. To enable Application Links to function properly, make sure to upgrade any other Atlassian products to a minimum supported version:
Â
Jira Software
Jira Service Management
Confluence
Bitbucket
Bamboo
Crowd
Fisheye and Crucible
9.4.24
9.12.12
9.17.1
10.0.0
5.4.24
5.12.12
5.17.1
10.0.0
7.19.25
8.5.12
8.9.4
9.0.0
8.9.15
8.19.4
9.0.0
9.2.15
9.6.3
10.0.0
5.11.1
5.2.6
5.3.2
6.0.0
4.8.6
4.9.0
Velocity path traversal prevention and allowlisting
We've upgraded Velocity to the Atlassian fork to implement path traversal prevention and allowlisting. The path traversal mechanism will escape any method call which contains parameter with path traversal symbols like ../. The method call will appear as a string on the front-end side.
Velocity template method invocations are now restricted to an allowlist. Unauthorized invocations will trigger a log warning and will be blocked to mitigate Server-Side Template Injection (SSTI) vulnerabilities. The global method allowlists encompass JDK and Atlassian class methods. Apps have the option to define their own allowlist using the module descriptor which will complement the global allowlist. We recommend that apps only expose immutable Data Transfer Objects (DTOs) and refrain from invoking application services or beans from templates.
For now, the Velocity method allowlist is in debug mode so that app developers can adjust to this mechanism and for us to complete the main allowlist and minimize the risk of issues. The debug mode will be disabled at the earliest in the upcoming LTS.
Updates to database schema
We’ve updated the created column in the changegroup, jiraissue, and jiraaction tables to support millisecond precision. This change affects Oracle and MySQL databases only. No action is required—the schema will be automatically migrated upon restart.
Removal of the jira-func-tests-legacy module
We’ve removed the deprecated com.atlassian.jira:jira-func-tests-legacy module. Migrate your code from BaseJIRAWebTest (JUnit 3) to FuncTestCase (JUnit 4+).
Disabling the runtime JavaServer Pages compilation
JavaServer Pages (JSP) runtime compilation will be disabled in Jira Software 10.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. We recommend using Soy or Velocity templates instead.
Custom JSPs are blocked unless loaded by an action
We’ve blocked direct requests to JSP files. JSP files can now be only loaded when requested by an action.
Unbundling of atlassian-frontend-runtime-plugin
We’ve unbundled 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, we’ve removed it in Jira Software 10.0.
If your code is still using any web resources from this plugin, the following warnings may appear in your Jira logs:
This webresource is empty! All supported browsers no longer need these polyfills. Please remove your dependency on the "atlassian-frontend-runtime-plugin".
or
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.
Deprecation of jquery-migrate 1.x
We’re upgrading jQuery and as part of that effort, we’ve deprecated jquery-migrate 1.x in Jira Software 10.0 and removed it 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.
Centralized dependency management
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:
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:
Remove the jira-project dependency management import.
Add jira-api-bom as a dependency with scope import.
Consider adding jira-deprecated-api-bom if needed, but note that these dependencies are marked as deprecated and will be removed in future versions.
Remove redundant dependency management sections from your poms (for artefacts covered by the BOM).
Since BOM doesn't define scope, if your dependency management section used to contain scope definition, you must now add it to the actual dependency declaration.
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.
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.
Changes to supported platforms
See what changes have been made to supported platforms in this Jira release. For more details, check out Supported platforms.
To optimize the user experience requests are redirected (HTTP 302) to the login page when a security clearance requirement isn't met. This doesn’t apply to REST endpoints as they're intended for machines and programmatic use cases. For those, REST requests are rejected (HTTP 401/403). However, if your code is making a call to a non-REST endpoint, you need to handle the redirection case. Otherwise, your code can interpret the login page as the expected data and throw a parsing error.
We’re planning to improve this behavior in a future release by examining the Accept header before deciding whether to redirect or reject a request.
Automation for Jira 9.0.1 upgrade
If at some point you’ve used Automation for Jira version 9.0.1 and try to upgrade from Jira 8.20.x or later to Jira 10.0, you might experience issues around automation rules (such as not being allowed to enable, disable, or publish automation rules). Learn more about this issue
To fix this issue, you need to run the relevant SQL scripts manually in the Jira database:
See Upgrading Jira applications for complete upgrade procedures, including all available upgrade methods and pre-upgrade steps.Â
For a more tailored upgrade, go to Jira administration, then Applications, then Plan your upgrade. We’ll recommend a version to upgrade to, run pre-upgrade checks, and provide you with a custom upgrade guide with step-by-step instructions.
Check the compatibility of your Marketplace apps
As a major release, Jira 10.0 introduces backward-incompatible changes to the apps' API. If you build custom in-house apps, you need to test their compatibility and update them.
If you have installed apps from the Atlassian marketplace or another source, you also need to check their compatibility and update them before performing the upgrade. To check app compatibility, visit Checking app compatibility with application updates or the Atlassian Marketplace to see if your app hosting is compatible with your product version.
Â
Front-end API changes
This release brings an improved and updated Code sharing section of the Jira Data Center front-end API. We’ve introduced the following changes:
Inclusion of Jira-specific API modules, such as requested Jira Events.
Extensions and updates to common libraries.
Introduction to particular versioning of common libraries and alias module type.
Annotations to modules on the UPM level and better descriptions in the code.
Regular modules for the common libraries are versioned up to the minor version (
x.y
), for example, under thejira-frontend-api:react-18.3
web-resource Jira provides React 18.3.1, as of now. The patch version (aka bug fix) can be changed at any time, for example, the same web-resource can provide React 18.3.2 in the future.The alias modules are versioned up to the major version (
x
), for example, under thejira-frontend-api:react-18
web-resource Jira provides React 18.3.1, as of now. The minor version can be changed at any time, for example, the same web-resource can provide React 18.4.0 in the future.Dependency
Change
Rationale
jira-frontend-api:jquery-2.2.4
Deprecated. Use
jira-frontend-api:jquery (jira/api/jquery
AMD) instead.Jira provides and supports the single jQuery version only. It can also be modified by Atlassian to include certain fixes. This is why the version has been dropped from the web-resource key. It’ll also make the migration to newer versions easier.
jira-frontend-api:underscore-1.8
Deprecated. Use
jira-frontend-api:underscore-1.13
(jira/api/underscore-1.13
AMD) instead.The recommended underscorejs version is the newest available one as of now (1.13.6).
The full list of available modules:
Dependency
AMD module
Rationale
Jira-specific
jira-frontend-api:almond
n/a
Provides AMD support by exposing
define
andrequire
global functions. You don’t typically need to depend on Almond as it’s provided by default. However, it may be required if you build the custom page.jira-frontend-api:version
jira/api/version
The module allows to #get the current Jira version, as well as #compare and #isGreaterThanOrEqualTo the current Jira version with a provided one.
jira-frontend-api:jira-events
jira/api/events
jira/api/events/reasons
jira/api/events/types
Provides Jira-namespaced event bus.
Provides a dictionary of reasons for events being triggered in Jira, such as
panelRefreshed
.Provides a dictionary of event types, such as
NEW_CONTENT_ADDED
.Common libraries
jira-frontend-api:jquery
jira/api/jquery
Provides jQuery used across Jira.
Current version: 2.2.4 with patches
jira-frontend-api:underscore-1.13
jira/api/underscore-1.13
Provides Underscore 1.13.x.
Current version: 1.13.6.
jira-frontend-api:backbone-1.6
jira/api/backbone-1.6
Provides Backbone.js 1.6.x.
Current version: 1.6.0.
jira-frontend-api:react-18.3
jira/api/react-18.3
Alias module. Provides React 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18.3
jira/api/react-dom-18.3
Provides React-DOM 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18
jira/api/react-dom-18
Alias module. Provides React-DOM 18.3.x.
Current version: 18.3.1.
Common libraries (deprecated)
jira-frontend-api:jquery-2.2.4
jira/api/jquery-2.2.4
Deprecated. Use
jira-frontend-api:jquery
(jira/api/jquery
AMD) insteadjira-frontend-api:underscore-1.8
jira/api/underscore-1.8
Deprecated. Use
jira-frontend-api:underscore-1.13
(jira/api/underscore-1.13
AMD) instead.jira-frontend-api:react-16
jira/api/react-16.8
Deprecated. Use
jira-frontend-api:react-18.3
(jira/api/react-18.3
AMD) instead.Provides React 16.8.x.
Current version: 16.8.6.
jira/api/react-16
Deprecated. Use
jira-frontend-api:react-18
(jira/api/react-18
AMD) instead.Alias module. Provides React 16.x.
Current version: 16.8.6.
jira-frontend-api:react-dom-16
jira/api/react-dom-16.8
Deprecated. Use j
ira-frontend-api:react-dom-18.3
(jira/api/react-dom-18.3
AMD) instead.Provides React-DOM 16.8.x.
Current version: 16.8.6.
jira/api/react-dom-16
Deprecated. Use
jira-frontend-api:react-dom-18
(jira/api/react-dom-18
AMD) instead.Alias module. Provides React-DOM 16.x.
Current version: 16.8.6.
OpenAPI standard for REST API documentation
REST API documentation for Jira Core and Jira Software is now available in an OpenAPI standard with a refreshed graphical form. This is the first time REST API documentation for Jira Core and Jira Software is no longer split. What’s more, we’ve reviewed and updated the documentation content. Get started with REST API documentation for Jira
Removal of previously deprecated feature flags
In this release, we’ve removed the following feature flags:
com.atlassian.jira.agile.darkfeature.burnupchart
optimistic.transitions
com.atlassian.jira.advanced.audit.log
velocity.chart.ui
jira.quick.search
com.atlassian.jira.custom.csv.escaper
atlassian.cdn.static.assets
jira.users.and.roles.page.in.react
All features previously hidden behind those feature flags were enabled by default.
Breaking changes to the Java API
In this release, we've removed several deprecated methods and classes. Additionally, we’ve made adjustments to a group of methods which involved modifying the signatures and return types.
Here’s what’s been changed:
Classes
Changed symbols
Instructions
com.atlassian.jira.issue.customfields.CustomFieldType
#getNonnullCustomFieldProvider()
removed.Use
#getNonNullCustomFieldProvider()
instead.com.atlassian.jira.issue.customfields.vdi.NonNullCustomFieldProvider
com.atlassian.jira.issue.customfields.DefaultNonNullCustomFieldProvider
#getCustomFieldInfo(com.atlassian.jira.issue.Issue)
removed.Use
#getCustomFieldInfo(java.util.List issues)
instead.You now need to implement
#getCustomFieldInfo(java.util.List<com.atlassian.jira.issue.Issue> issues)
in every class you were previously implementing#getCustomFieldInfo(com.atlassian.jira.issue.Issue issue)
.com.atlassian.jira.issue.customfields.NonnullCustomFieldProvider
com.atlassian.jira.issue.customfields.persistence.DefaultNonnullCustomFieldProvider
com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData
Whole classes removed.
Use
com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData
instead.com.atlassian.jira.issue.index.indexers.FieldIndexer
com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
com.atlassian.jira.issue.customfields.impl.TextCFType
#addIndex(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData)
removed.Use
#addIndex(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
#addDocumentFieldsNotSearchable(org.apache.lucene.document.Document doc, com.atlassian.jira.issue.Issue issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData prefetchedData)
removed.Use
#addDocumentFieldsNotSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
#addDocumentFieldsSearchable(org.apache.lucene.document.Document doc, com.atlassian.jira.issue.Issue issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData prefetchedData)
removed.Use
#addDocumentFieldsSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.bc.user.search.UserSearchParams
All public constructors removed.
Use
UserSearchParams.Builder
to construct an instance ofUserSearchParams
instead of using the constructor.com.atlassian.jira.bc.user.search.UserSearchParams
#builder()
behavior changed.The behavior of this method changed, it was left for convenience. It now mirrors the behavior of
UserSearchParams.builder(MAXIMUM_RESULTS)
.com.atlassian.jira.util.collect.CollectionUtil
#filter(Collection<T>, Predicate<? super T>)
removed.Use standard
Stream#filter(Predicate<?>)
and appropriateStream#collect(...)
call.com.atlassian.jira.security.GlobalPermissionEntry
#getGlobalPermissionType()
removed.Use
#getPermissionKey()
instead.com.atlassian.jira.security.JiraAuthenticationContext
#getI18nBean()
 removed.Use
#getI18nHelper()
instead.com.atlassian.jira.security.JiraAuthenticationContext
#getText(java.lang.String)
removed.Use
#getText()
method on#getI18nHelper()
.com.atlassian.jira.sharing.ShareManager
#hasPermission(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.sharing.SharedEntity)
removed.Use
#isSharedWith(com.atlassian.crowd.embedded.api.User, SharedEntity)
to get the same logic. Permission checks should be done in the service layer according to this information.com.atlassian.jira.user.preferences.JiraUserPreferences
Whole class removed from public API.
You should not construct user preferences directly. Request them through the
UserPreferencesManager
instead.com.atlassian.jira.util.collect.MapBuilder
#toFastMap()
removed.Use
ImmutableMap
directly instead.com.atlassian.jira.util.collect.MapBuilder
#toImmutableMap()
removed.Use
#toMap()
instead, or consider usingImmutableMap
if the map doesn't need to accept nulls.com.atlassian.jira.util.index.Contexts
#nullContext()
removed.Use
com.atlassian.jira.task.context.Contexts#nullContext()
instead.com.atlassian.jira.util.JiraDurationUtils
#onClearCache(com.atlassian.jira.event.ClearCacheEvent)
removed.Use the
DurationFormatChanged
event instead.com.atlassian.jira.util.JiraDurationUtils
#start()
removed.No replacement.
com.atlassian.jira.web.action.issue.IssueCreationHelperBean
#getProvidedFieldNames(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue)
removed.Avoid using
IssueCreationHelperBean
class as it’ll be removed. Before it happens, use#getProvidedFieldNames(com.atlassian.jira.issue.Issue)
instead.com.atlassian.jira.web.bean.MultiBulkMoveBean
#setTargetProject(org.ofbiz.core.entity.GenericValue)
removed.Use
#setTargetProject(com.atlassian.jira.project.Project)
instead.com.atlassian.jira.web.util.HelpUtil.HelpPath
#getSimpleUrl()
removed.Use
#getUrl()
instead.com.atlassian.jira.web.util.OutlookDate
#format()
#getDateTimePickerFormatSample(java.util.Date)
removed.
Use
com.atlassian.jira.datetime.DateTimeFormatter#format(java.util.Date)
instead.com.atlassian.jira.web.util.OutlookDate
#getCompleteDateFormat()
#getDatePickerFormat()
#getDateTimePickerFormat()
removed.
Use
com.atlassian.jira.datetime.DateTimeFormatter#getFormatHint()
instead.com.atlassian.jira.web.util.OutlookDate
#getNow()
removed.Use
java.util.Date#Date()
instead.com.atlassian.jira.permission.SchemePermissions
Whole class removed.
Use
com.atlassian.jira.security.PermissionManager
instead.com.atlassian.jira.permission.Permission
Whole class removed.
Use
com.atlassian.jira.security.PermissionManager
orcom.atlassian.jira.security.GlobalPermissionManager
instead.com.atlassian.jira.issue.attachment.AttachmentZipKit
Whole class removed.
Use
com.atlassian.jira.issue.AttachmentIndexManager
instead.com.atlassian.jira.util.NotNull
(annotation)Whole class removed.
Use
javax.annotation.Nonnull
instead.com.atlassian.jira.security.PermissionManager
including its subclasses:com.atlassian.jira.security.PublicAccessPermissionManager
com.atlassian.jira.security.ApplicationRequiredPermissionManager
com.atlassian.jira.security.DefaultPermissionManager
com.atlassian.jira.security.SubvertedPermissionManager
getProjects(int, com.atlassian.jira.user.ApplicationUser)
getProjects(int permissionId, ApplicationUser user, ProjectCategory projectCategory)
removed.
Use 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)
com.atlassian.jira.help.HelpUrlsParser
#defaultUrl(String, String)
#onDemand(boolean)
removed.
Use
com.atlassian.jira.help.HelpUrlsParserBuilderFactory
to construct newHelpUrlsParse
instance.com.atlassian.jira.imports.project.mapper.ProjectImportIdMapper
#getValuesFromImport()
 removed.Use
#getRegisteredOldIds()
(and#getKey()
if needed) instead.com.atlassian.jira.imports.project.mapper.ProjectRoleActorMapper
#getAllProjectRoleActors()
removed.Use the properly typed method
#getProjectRoleActors()
instead.com.atlassian.jira.issue.comments.CommentManager
#getProjectRole(java.lang.Long)
removed.Use
com.atlassian.jira.security.roles.ProjectRoleManager#getProjectRole(Long)
instead.com.atlassian.jira.issue.fields.layout.field.FieldLayoutStorageException
Whole class removed.
No replacement
com.atlassian.jira.issue.fields.rest.json.CommentBeanFactory
#createRenderedBean(com.atlassian.jira.issue.comments.Comment)
removed.Use
#createRenderedBean(com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.util.EmailFormatter)
instead.com.atlassian.jira.issue.index.ReindexAllCompletedEvent
#shouldUpdateReplicatedIndex()
#ReindexAllCompletedEvent(long)
#ReindexAllCompletedEvent(long, boolean, boolean)
removed.
Use
#shouldNotifyCluster()
instead.Do not construct internal
ReindexAllCompletedEvent
class.com.atlassian.jira.issue.index.ReindexAllStartedEvent
#shouldUpdateReplicatedIndex()
#ReindexAllStartedEvent()
#ReindexAllStartedEvent(boolean, boolean)
#ReindexAllStartedEvent(boolean, boolean, com.atlassian.jira.issue.index.IssueIndexingParams, com.atlassian.jira.config.ReindexMessage)
removed.
Use
#shouldNotifyCluster()
instead.Don't construct internal
ReindexAllStartedEvent
class.com.atlassian.jira.bc.project.version.VersionService
#delete(JiraServiceContext, ValidationResult)
removed.Use
com.atlassian.jira.bc.project.version.VersionService#deleteVersionAndSwap
instead.com.atlassian.jira.bc.project.version.VersionService
#deleteVersion(ApplicationUser, Version, Option<Version>, Option<Version>)
removed.Use
com.atlassian.jira.project.version.VersionManager#deleteVersionAndSwap
instead.com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult
#getLicenseVersion()
removed.Use
#getLicenseDetails().getLicenseVersion()
instead.com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult
#getTotalUserCount()
removed.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)
removed.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)
#validateReleaseDate(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String)
removed.
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)
removed.Use
#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.user.ApplicationUser,com.atlassian.application.api.ApplicationKey)
instead.com.atlassian.jira.bc.customfield.CustomFieldDefinition
#CustomFieldDefinition()
removed.Use
#builder()
to construct the instance.com.atlassian.jira.bc.issue.comment.CommentService
#isGroupVisiblityEnabled()
renamed to#isGroupVisibilityEnabled()
#isProjectVisiblityEnabled()
renamed to#isProjectRoleVisibilityEnabled()
removed.
Use method with the
visiblity
typo corrected tovisibility
.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)
removed.Use
#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()
#getRoleLevelId()
removed.
Use the
#getVisibility()
method returning Visibility instance. Example of use that returnsio.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()
isGroupVisiblityEnabled()
renamed to#isGroupVisibilityEnabled()
removed.
Use methods with the
visiblity
typo corrected tovisibility
.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)
removed.Use
#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
com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl
#getGroupLevel()
#getRoleLevelId()
removed.
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()
removed.Use
#getProgressAwareBulkOperations()
instead.com.atlassian.jira.bulkedit.BulkOperationManager
#addBulkOperation(String, Class)
removed.Use #
addProgressAwareBulkOperation(String, Class)
instead.com.atlassian.jira.bulkedit.BulkOperationManager
#getOperation(String)
removed.Use
#getProgressAwareOperation(String)
instead.com.atlassian.jira.bulkedit.operation.BulkOperation
Whole class removed.
Use
com.atlassian.jira.bulkedit.operation.ProgressAwareBulkOperation
instead.com.atlassian.jira.config.ConstantsManager
#storeIssueTypes(java.util.List<org.ofbiz.core.entity.GenericValue>)
removed.Use
#updateIssueType(String, String, Long, String, String, Long)
orrecalculateIssueTypeSequencesAndStore(java.util.List)
instead.com.atlassian.jira.config.properties.LookAndFeelBean
#getVersion()
removed.Use
#getSettingsHash()
to get the state of Look and feel.com.atlassian.jira.config.properties.LookAndFeelBean
#updateVersion(long)
removed.Use
#updateSettingsHash()
instead.com.atlassian.jira.config.SubTaskManager
#insertSubTaskIssueType(java.lang.String, java.lang.Long, java.lang.String, java.lang.String)
removed.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)
removed.Use
#updateSubTaskIssueType(String,String,Long,String,Long)
instead.com.atlassian.jira.event.issue.IssueWatcherAddedEvent
com.atlassian.jira.event.issue.IssueWatcherDeletedEvent
#getUser()
removed.Use
#getApplicationUser()
insteadcom.atlassian.jira.event.mail.EmailQueueFlashedEvent
Whole class removed.
Use
#com.atlassian.jira.event.mail.EmailQueueFlushedEvent
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
Whole classes removed from public API.
Use the following API code instead:
com.atlassian.audit.entity.AuditResource
com.atlassian.audit.entity.ChangedValue
com.atlassian.jira.auditing.AuditCategory
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.WhitelistService
com.atlassian.jira.bc.whitelist.WhitelistManager
Whole classes removed.
Use
com.atlassian.plugins.whitelist.WhitelistService
andcom.atlassian.plugins.whitelist.OutboundWhitelist
instead.com.atlassian.jira.issue.search.managers.IssueSearcherManager
com.atlassian.jira.issue.search.managers.SearchHandlerManager
#getSearcherGroups(com.atlassian.jira.issue.search.SearchContext)
removed.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)
removed.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)
removed.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)
removed.Use
#getAllNavigatorValuesForMatchingClauses(ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query)
instead.com.atlassian.jira.issue.util.IssueUpdateBean
#getUser()
removed.Use
#getApplicationUser()
instead.com.atlassian.jira.jql.query.AbstractLocalDateOperatorQueryFactory
Whole class removed.
Use
com.atlassian.jira.jql.util.JqlLocalDateSupport#getLocalDatesFromQueryLiterals(java.util.List)
instead.com.atlassian.jira.jql.util.JqlIssueSupport
#getIssues(java.lang.String)
removed.Use
#getIssue(java.lang.String)
instead.com.atlassian.jira.jql.util.JqlIssueSupport
#getIssues(java.lang.String, com.atlassian.jira.user.ApplicationUser)
removed.Use
#getIssue(java.lang.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)
#getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper, com.atlassian.jira.web.util.OutlookDate, java.lang.String, com.atlassian.jira.user.util.UserManager)
removed.Use
#getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager)
instead.com.atlassian.jira.license.LicenseDetails
#isLicenseAlmostExpired()
removed.Use
#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)
removed.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)
removed.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)
removed.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)
removed.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)
removed.Use
#getGroups(ProjectPermissionKey,Project)
instead.com.atlassian.jira.plugin.keyboardshortcut.KeyboardShortcutManager
#getActiveShortcuts()
removed.Use
#listActiveShortcutsUniquePerContext
instead.com.atlassian.jira.plugin.webfragment.conditions.AbstractJiraPermissionCondition
Whole class removed.
Use
AbstractPermissionCondition
instead.com.atlassian.jira.plugin.webfragment.conditions.AbstractPermissionCondition
Whole class removed.
Use
AbstractProjectPermissionCondition
instead.com.atlassian.jira.project.type.ProjectTypesEnabledCondition
Whole class removed.
No replacement.
com.atlassian.jira.issue.table.IssueTable
provided byjira-api
Whole class removed.
Use
com.atlassian.jira.issue.table.IssueTable
provided byjira-issue-nav-plugin
instead.com.atlassian.jira.rest.Dates.DateAdapter
com.atlassian.jira.rest.Dates.DateTimeAdapter
Whole classes removed.
For marshalling and unmarshalling, use the Jackson-friendly serializers and deserializers:
@JsonSerialize(using = Dates.DateSerializer.class)
@JsonDeserialize(using = Dates.DateDeserializer.class)
com.atlassian.jira.rest.v2.issue.project.ProjectRoleBean
Whole classes removed.
Use com.atlassian.jira.rest.api.project.ProjectRoleBean instead.
com.atlassian.jira.rest.v2.issue.project.RoleActorBean
Whole classes removed.
Use com.atlassian.jira.rest.api.project.RoleActorBean
instead.com.atlassian.jira.rest.v1.model.ValueCollection
Whole classes removed.
No replacement.
com.atlassian.jira.testkit.client.restclient.Response
provided byjira-testkit-client
The class has been deprecated.
Use
com.atlassian.jira.testkit.client.restclient.ParsedResponse
instead.com.atlassian.jira.testkit.client.RestApiClient
#toResponse()
acceptsRestCall
functional interface.Use new
RestCall
interface or lambda in place ofMethod
interface.com.atlassian.jira.avatar.AvatarManager
Â
#getAvatarBaseDirectory
removed.Use
#readAvatarData()
to access avatar data directly.com.atlassian.jira.util.AttachmentConfig
Whole classes removed.
Use
AttachmentConfigManager#getTemporaryAttachmentDirectory()
instead.com.atlassian.jira.issue.attachment.AttachmentStore
Whole classes removed.
Use alternative methods provided by:
AttachmentManager
ThumbnailManager
AttachmentConfigManager
com.atlassian.jira.util.AttachmentUtils
Whole classes removed.
To create, read, or delete attachment and thumbnail data directly, use the methods available in
AttachmentManager
andThumbnailManager
.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.Instead of
getTemporaryAttachmentDirectory()
, useAttachmentConfigManager#getTemporaryAttachmentDirectory()
.Instead of
getAttachmentFile
andgetThumbnailFile
methods, useAttachmentManager
andThumbnalManager
. For exampleAttachmentManager#streamAttachmentContent
.The following checks can be omitted:
checkValidAttachmentDirectory
andcheckValidTemporaryAttachmentDirectory
. Jira checks the validity of paths during startup.AttachmentManager
#attachmentsEnabled()
removed.Use
AttachmentConfigManager#isAttachmentsEnabled()
instead.AttachmentManager
#disableAttachments()
removed.No replacement.
AttachmentManager
#createAttachmentCopySourceFile
and previously deprecated overloads of#createAttachment
removed.Use
#createAttachment(CreateAttachmentParamsBean)
instead.com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean
#CreateAttachmentParamsBean
removed.Use the provided builder
com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean.Builder
instead.AttachmentManager
#deleteAttachmentDirectory(Issue)
removed.To delete an issue, use
IssueManager#deleteIssue
instead.com.atlassian.jira.issue.IssueInputParameters
#addProperty(String propertyKey, JsonNode propertyValue)
changed to #addProperty(String propertyKey, String propertyValue).#properties()
now returnsMap<String, String>
instead ofMap<String, JsonNode>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.issue.UpdateIssueRequest
#getProperties()
now returnsMap<String, String>
instead of Map<String, JsonNode>#UpdateIssueRequestBuilder#issueProperties
now acceptsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.issue.util.IssueUpdateBean
#getProperties
now returnsMap<String, String>
#addProperties
now acceptsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.CreateValidationResult
constructor now accepts
Map<String, String>
#getProperties
now returnsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.UpdateValidationResult
constructor
now acceptsMap<String, String>
#getProperties
now returnsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.configurable.ObjectConfigurationFactory
#loadObjectConfigurationFromElement
now acceptscom.atlassian.plugin.module.Element
instead oforg.dom4j.Element
Use the new type in method calls.
com.atlassian.jira.issue.fields.rest.IssueFinderV2
#findIssue(String) now returns
io.atlassian.fugue.Either
instead ofcom.atlassian.fugue.Either
Replaced class is equivalent.
com.atlassian.jira.config.util
AttachmentPathManager
Whole class removed.
Use the methods available in
AttachmentManager
to create/read/delete attachment data directly. For the settings related methods, use the new endpoints provided inAttachmentConfigManager
.com.atlassian.jira.testkit.client.AttachmentsControl
com.atlassian.jira.testkit.plugin.AttachmentsBackdoor)
Whole classes removed.
Use
com.atlassian.jira.functest.framework.backdoor.AttachmentFileControl
injira-func-tests
(which requires thejira-func-test-plugin
to be installed). It provides storage-agnostic alternative methods to allow copying and clearing attachments.com.atlassian.jira.bc.dataimport.DataImportParams
Â
#isUseDefaultPaths
Builder#setUseDefaultPaths
This option is no longer supported.
com.atlassian.jira.web.action.JiraWebActionSupport
Â
Breaking changes to the REST API
In this release, we’ve removed a set of REST API endpoints that have been deprecated since Jira Software 9.x.
Here’s what’s been changed:
Change
Instructions
Removed private endpoint
POST /api/1.0/user/{username}/avatar/{avatarid}
provided bycom.atlassian.jira.rest.v1.users.UserResource
Use
PUT /rest/api/2/user/avatar
provided bycom.atlassian.jira.rest.v2.issue.UserResource#updateUserAvatar
instead.Removed private endpoint
GET globalconfig/1/issuecustomfields/{issue}
provided bycom.atlassian.jira.projectconfig.rest.global.IssueCustomFieldsResource#getAffectedProjects
No replacement.
Removed private endpoint
POST globalconfig/1/customfieldoptions/{customFieldId}/
provided bycom.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptions
Use
POST globalconfig/1/customfieldoptions/{customFieldId}/setOptions
provided bycom.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsForCustomField
instead./greenhopper/1.0/api/sprints/{sprintId}/remotelink
provided bycom.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createOrUpdateRemoteSprintLink
Use
greenhopper/1.0/api/sprints/{sprintId}/remotelinkchecked
provided bycom.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createRemoteSprintLinkChecked
instead.Removed public endpoints:
GETÂ /rest/api/2/auditing/record
POSTÂ /rest/api/2/auditing/record
Use the following 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 bycom.atlassian.jira.rest.v2.issue.GroupResource#getGroup
Use
GET /rest/api/2/group/member
provided bycom.atlassian.jira.rest.v2.issue.GroupResource#getUsersFromGroup
.Removed public endpoint
DELETE /rest/api/2/version/{id}
provided bycom.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 bycom.atlassian.jira.rest.v2.issue.VersionResource#delete(String, DeleteAndReplaceVersionBean)
.Note that the replacement endpoint doesn't publish the
jira:version_merged
webhook event.JIRA SERVICE MANAGEMENT Removed
GET /servicedeskapi/queues/{projectKey}
Use
GET /servicedeskapi/admin/queues/{projectKey}
instead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/include-count
Use
PUT /servicedeskapi/admin/queues/include-count
instead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/{projectKey}/include-count
Â
Use
PUT /servicedeskapi/admin/queues/{projectKey}/include-count
instead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/cache-count
Use
PUT /servicedeskapi/admin/queues/cache-count
instead.JIRA SERVICE MANAGEMENTRemoved
PUT /servicedeskapi/queues/{projectKey}/cache-count
Use
PUT /servicedeskapi/admin/queues/{projectKey}/cache-count
instead.The
GET rest/api/2/serverInfo
endpoint no longer supports the doHealthCheck parameter and does not include the healthChecks field in the response.Use
jira-healthcheck-plugin
instead.Removed
GET rest/api/1.0/endpoint
Â
Removal of dependencies
In this release, we’ve removed access to a number of dependencies.
Here’s what’s been changed:
Dependency
Java 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-plugin
scala.*
com.atlassian.scala.plugins:scala-2.10-provider-plugin
scala.*
com.atlassian.scala.plugins:jackson-module-scala-2.10-provider-plugin
com.fasterxml.jackson.module.scala2_10
io.atlassian.fugue:fugue-scala
io.atlassian.fugue.converters
commons-daemon:commons-daemon
org.apache.commons.daemon.*
org.apache.tomcat:tomcat-coyote
org.apache.coyote.*
commons-el:commons-el
org.apache.commons.el.*
org.apache.tomcat:tomcat-jasper
org.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-collections4
org.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-jexl
org.apache.commons.jexl.*
commons-jrcs:commons-jrcs
org.apache.commons.jrcs.*
com.github.rholder:guava-retrying
com.github.rholder.retry.*
org.dom4j:dom4j
org.dom4j.*
opensymphony:sitemesh
com.opensymphony.module.*
com.opensymphony.sitemesh.*
org.jdom:jdom
org.jdom.*
commons-pool:commons-pool
org.apache.commons.pool.*
org.tuckey:urlrewritefilter
org.tuckey.web.filters.urlrewrite.*
org.springframework.security:spring-security-core
org.springframework.security.*
com.atlassian.p4package:atlassian-p4package
com.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_codec
com.sun.media.jai.*
wsdl4j:wsdl4j
com.ibm.wsdl
com.ibm.wsdl.*
javax.wsdl
javax.wsdl.*
com.atlassian.fugue:fugue
com.atlassian.fugue.*
org.dom4j:dom4j
org.dom4j.*
Â
Removal of binary installers
Starting from Jira 10.0, the
.bin
and.exe
installers will no longer be available. You can still install Jira using the.zip
and.tar.gz
distributions.Because of this change, Java is no longer bundled with Jira. Install Java manually
Jira Software and Jira Core dialogs migrated to AUI Dialog 2
This is still a work in progress. You can expect to see the full removal of AUI Dialog 1 from the Jira codebase by the upcoming LTS release.
Jira Software and Jira Core currently stand with significant majority of the components migrated to use AUI Dialog 2. AUI Dialog 1 will be removed from Jira completely by the upcoming LTS release. If your app uses that component, make sure to migrate to AUI Dialog 2.
Application Links compatibility
Starting from Jira 10.0, Application Links are only backward-compatible with products that have integrated a particular bug fix addressing incorrect Application Links version parsing. To enable Application Links to function properly, make sure to upgrade any other Atlassian products to a minimum supported version:
Â
Jira Software
Jira Service Management
Confluence
Bitbucket
Bamboo
Crowd
Fisheye and Crucible
9.4.24
9.12.12
9.17.1
10.0.0
5.4.24
5.12.12
5.17.1
10.0.0
7.19.25
8.5.12
8.9.4
9.0.0
8.9.15
8.19.4
9.0.0
9.2.15
9.6.3
10.0.0
5.11.1
5.2.6
5.3.2
6.0.0
4.8.6
4.9.0
Velocity path traversal prevention and allowlisting
We've upgraded Velocity to the Atlassian fork to implement path traversal prevention and allowlisting. The path traversal mechanism will escape any method call which contains parameter with path traversal symbols like
../
. The method call will appear as a string on the front-end side.Velocity template method invocations are now restricted to an allowlist. Unauthorized invocations will trigger a log warning and will be blocked to mitigate Server-Side Template Injection (SSTI) vulnerabilities. The global method allowlists encompass JDK and Atlassian class methods. Apps have the option to define their own allowlist using the module descriptor which will complement the global allowlist. We recommend that apps only expose immutable Data Transfer Objects (DTOs) and refrain from invoking application services or beans from templates.
Furthermore, all Velocity template files residing on the file system must be both allowlisted and of an allowlisted file type. This serves as a basic defense against attacks that combine file system access with a request to achieve remote code execution.
For now, the Velocity method allowlist is in debug mode so that app developers can adjust to this mechanism and for us to complete the main allowlist and minimize the risk of issues. The debug mode will be disabled at the earliest in the upcoming LTS.
Updates to database schema
We’ve updated the
created
column in thechangegroup
,jiraissue
, andjiraaction
tables to support millisecond precision. This change affects Oracle and MySQL databases only. No action is required—the schema will be automatically migrated upon restart.Removal of the jira-func-tests-legacy module
We’ve removed the deprecated
com.atlassian.jira:jira-func-tests-legacy
module. Migrate your code fromBaseJIRAWebTest
(JUnit 3) toFuncTestCase
(JUnit 4+).Disabling the runtime JavaServer Pages compilation
JavaServer Pages (JSP) runtime compilation will be disabled in Jira Software 10.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. We recommend using Soy or Velocity templates instead.
Custom JSPs are blocked unless loaded by an action
We’ve blocked direct requests to JSP files. JSP files can now be only loaded when requested by an action.
Unbundling of atlassian-frontend-runtime-plugin
We’ve unbundled 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, we’ve removed it in Jira Software 10.0.
If your code is still using any web resources from this plugin, the following warnings may appear in your Jira logs:
This webresource is empty! All supported browsers no longer need these polyfills. Please remove your dependency on the "atlassian-frontend-runtime-plugin".
or
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
, andfocus-visible
were already empty web resources, while theregenerator-runtime
was still provided.Deprecation of jquery-migrate 1.x
We’re upgrading jQuery and as part of that effort, we’ve deprecated jquery-migrate 1.x in Jira Software 10.0 and removed it from the superbatch Web Resource.
While jquery-migrate can still be loaded using certain Web Resource Keys (such as
com.atlassian.plugins.jquery:jquery
orcom.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.
Centralized dependency management
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.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 3 4 5 6 7 <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 3 4 5 <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:
Remove the
jira-project
dependency management import.Add
jira-api-bom
as a dependency with scopeimport
.Consider adding
jira-deprecated-api-bom
if needed, but note that these dependencies are marked as deprecated and will be removed in future versions.Remove redundant dependency management sections from your poms (for artefacts covered by the BOM).
Since BOM doesn't define
scope
, if your dependency management section used to containscope
definition, you must now add it to the actual dependency declaration.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.
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.Changes to supported platforms
See what changes have been made to supported platforms in this Jira release. For more details, check out Supported platforms.
End-of-support announcements
We’ve removed support for:
.bin
and.exe
binary installersWe’ve unbundled:
Java (due to the binary installers removal)
App developers
For any important changes regarding apps, check out the Jira changelog.
FAQ for app developers
Based on your feedback from the Developer Community announcement of Jira Software 10.0, we’ve prepared a list of frequently asked questions.https://confluence.atlassian.com/jirasoftware/jira-software-10-0-x-upgrade-notes-1431241649.html
Â
Known issues
Redirect behavior of Stronger Defaults
To optimize the user experience requests are redirected (HTTP 302) to the login page when a security clearance requirement isn't met. This doesn’t apply to REST endpoints as they're intended for machines and programmatic use cases. For those, REST requests are rejected (HTTP 401/403). However, if your code is making a call to a non-REST endpoint, you need to handle the redirection case. Otherwise, your code can interpret the login page as the expected data and throw a parsing error.
We’re planning to improve this behavior in a future release by examining the
Accept
header before deciding whether to redirect or reject a request.Automation for Jira 9.0.1 upgrade
If at some point you’ve used Automation for Jira version 9.0.1 and try to upgrade from Jira 8.20.x or later to Jira 10.0, you might experience issues around automation rules (such as not being allowed to enable, disable, or publish automation rules). Learn more about this issue
To fix this issue, you need to run the relevant SQL scripts manually in the Jira database:
Upgrade procedure
Before you upgrade, check app compatibility by visiting Checking app compatibility with application updates or the Atlassian Marketplace to see if your app hosting is compatible with your product version.
Upgrading from Jira version 9.x.x?Â
Â
Â
Â
Â
View full product version
Link to comment
https://beta.jimiwikman.se/forums/topic/12319-jira-software-100/Share on other sites