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.
- Owner
comment_12665Check 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.3web-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-18web-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.4Deprecated. Use
jira-frontend-api:jquery (jira/api/jqueryAMD) 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.8Deprecated. Use
jira-frontend-api:underscore-1.13(jira/api/underscore-1.13AMD) 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:almondn/a
Provides AMD support by exposing
defineandrequireglobal 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:versionjira/api/versionThe 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-eventsjira/api/eventsjira/api/events/reasonsjira/api/events/typesProvides 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:jqueryjira/api/jqueryProvides jQuery used across Jira.
Current version: 2.2.4 with patches
jira-frontend-api:underscore-1.13jira/api/underscore-1.13Provides Underscore 1.13.x.
Current version: 1.13.6.
jira-frontend-api:backbone-1.6jira/api/backbone-1.6Provides Backbone.js 1.6.x.
Current version: 1.6.0.
jira-frontend-api:react-18.3jira/api/react-18.3Alias module. Provides React 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18.3jira/api/react-dom-18.3Provides React-DOM 18.3.x.
Current version: 18.3.1.
jira-frontend-api:react-dom-18jira/api/react-dom-18Alias module. Provides React-DOM 18.3.x.
Current version: 18.3.1.
Common libraries (deprecated)
jira-frontend-api:jquery-2.2.4jira/api/jquery-2.2.4Deprecated. Use
jira-frontend-api:jquery(jira/api/jqueryAMD) insteadjira-frontend-api:underscore-1.8jira/api/underscore-1.8Deprecated. Use
jira-frontend-api:underscore-1.13(jira/api/underscore-1.13AMD) instead.jira-frontend-api:react-16jira/api/react-16.8Deprecated. Use
jira-frontend-api:react-18.3(jira/api/react-18.3AMD) instead.Provides React 16.8.x.
Current version: 16.8.6.
jira/api/react-16Deprecated. Use
jira-frontend-api:react-18(jira/api/react-18AMD) instead.Alias module. Provides React 16.x.
Current version: 16.8.6.
jira-frontend-api:react-dom-16jira/api/react-dom-16.8Deprecated. Use j
ira-frontend-api:react-dom-18.3(jira/api/react-dom-18.3AMD) instead.Provides React-DOM 16.8.x.
Current version: 16.8.6.
jira/api/react-dom-16Deprecated. Use
jira-frontend-api:react-dom-18(jira/api/react-dom-18AMD) 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.burnupchartoptimistic.transitionscom.atlassian.jira.advanced.audit.logvelocity.chart.uijira.quick.searchcom.atlassian.jira.custom.csv.escaperatlassian.cdn.static.assetsjira.users.and.roles.page.in.reactAll 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.NonNullCustomFieldProvidercom.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.NonnullCustomFieldProvidercom.atlassian.jira.issue.customfields.persistence.DefaultNonnullCustomFieldProvidercom.atlassian.jira.issue.customfields.CustomFieldPrefetchedDataWhole classes removed.
Use
com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedDatainstead.com.atlassian.jira.issue.index.indexers.FieldIndexercom.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexercom.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.UserSearchParamsAll public constructors removed.
Use
UserSearchParams.Builderto construct an instance ofUserSearchParamsinstead 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.JiraUserPreferencesWhole class removed from public API.
You should not construct user preferences directly. Request them through the
UserPreferencesManagerinstead.com.atlassian.jira.util.collect.MapBuilder#toFastMap()removed.Use
ImmutableMapdirectly instead.com.atlassian.jira.util.collect.MapBuilder#toImmutableMap()removed.Use
#toMap()instead, or consider usingImmutableMapif 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
DurationFormatChangedevent 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
IssueCreationHelperBeanclass 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.SchemePermissionsWhole class removed.
Use
com.atlassian.jira.security.PermissionManagerinstead.com.atlassian.jira.permission.PermissionWhole class removed.
Use
com.atlassian.jira.security.PermissionManagerorcom.atlassian.jira.security.GlobalPermissionManagerinstead.com.atlassian.jira.issue.attachment.AttachmentZipKitWhole class removed.
Use
com.atlassian.jira.issue.AttachmentIndexManagerinstead.com.atlassian.jira.util.NotNull(annotation)Whole class removed.
Use
javax.annotation.Nonnullinstead.com.atlassian.jira.security.PermissionManagerincluding its subclasses:com.atlassian.jira.security.PublicAccessPermissionManagercom.atlassian.jira.security.ApplicationRequiredPermissionManagercom.atlassian.jira.security.DefaultPermissionManagercom.atlassian.jira.security.SubvertedPermissionManagergetProjects(int, com.atlassian.jira.user.ApplicationUser)getProjects(int permissionId, ApplicationUser user, ProjectCategory projectCategory)removed.
Use supported
getProjectsmethod, 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.HelpUrlsParserBuilderFactoryto construct newHelpUrlsParseinstance.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.FieldLayoutStorageExceptionWhole 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
ReindexAllCompletedEventclass.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
ReindexAllStartedEventclass.com.atlassian.jira.bc.project.version.VersionService#delete(JiraServiceContext, ValidationResult)removed.Use
com.atlassian.jira.bc.project.version.VersionService#deleteVersionAndSwapinstead.com.atlassian.jira.bc.project.version.VersionService#deleteVersion(ApplicationUser, Version, Option<Version>, Option<Version>)removed.Use
com.atlassian.jira.project.version.VersionManager#deleteVersionAndSwapinstead.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#updatePortalPagePortalPageManager#updatecom.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
visiblitytypo 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
visiblitytypo 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.WorklogInputParameterscom.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.BulkOperationWhole class removed.
Use
com.atlassian.jira.bulkedit.operation.ProgressAwareBulkOperationinstead.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.IssueWatcherAddedEventcom.atlassian.jira.event.issue.IssueWatcherDeletedEvent#getUser()removed.Use
#getApplicationUser()insteadcom.atlassian.jira.event.mail.EmailQueueFlashedEventWhole class removed.
Use
#com.atlassian.jira.event.mail.EmailQueueFlushedEventinstead.Deprecated audit API code:
com.atlassian.jira.auditing.AssociatedItemcom.atlassian.jira.auditing.ChangedValuecom.atlassian.jira.auditing.AuditingCategorycom.atlassian.jira.auditing.AuditingFiltercom.atlassian.jira.auditing.RecordRequestcom.atlassian.jira.auditing.AuditRecordWhole classes removed from public API.
Use the following API code instead:
com.atlassian.audit.entity.AuditResourcecom.atlassian.audit.entity.ChangedValuecom.atlassian.jira.auditing.AuditCategorycom.atlassian.audit.api.AuditQuerycom.atlassian.audit.entity.AuditEventcom.atlassian.audit.entity.AuditEntityFor more details, refer to the migration guide.
com.atlassian.jira.bc.whitelist.WhitelistServicecom.atlassian.jira.bc.whitelist.WhitelistManagerWhole classes removed.
Use
com.atlassian.plugins.whitelist.WhitelistServiceandcom.atlassian.plugins.whitelist.OutboundWhitelistinstead.com.atlassian.jira.issue.search.managers.IssueSearcherManagercom.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.AbstractLocalDateOperatorQueryFactoryWhole 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
#getMaintenanceExpiryDateinstead.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
#listActiveShortcutsUniquePerContextinstead.com.atlassian.jira.plugin.webfragment.conditions.AbstractJiraPermissionConditionWhole class removed.
Use
AbstractPermissionConditioninstead.com.atlassian.jira.plugin.webfragment.conditions.AbstractPermissionConditionWhole class removed.
Use
AbstractProjectPermissionConditioninstead.com.atlassian.jira.project.type.ProjectTypesEnabledConditionWhole class removed.
No replacement.
com.atlassian.jira.issue.table.IssueTableprovided byjira-apiWhole class removed.
Use
com.atlassian.jira.issue.table.IssueTableprovided byjira-issue-nav-plugininstead.com.atlassian.jira.rest.Dates.DateAdaptercom.atlassian.jira.rest.Dates.DateTimeAdapterWhole 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.ProjectRoleBeanWhole classes removed.
Use com.atlassian.jira.rest.api.project.ProjectRoleBean instead.com.atlassian.jira.rest.v2.issue.project.RoleActorBeanWhole classes removed.Use com.atlassian.jira.rest.api.project.RoleActorBeaninstead.com.atlassian.jira.rest.v1.model.ValueCollectionWhole classes removed.
No replacement.
com.atlassian.jira.testkit.client.restclient.Responseprovided byjira-testkit-clientThe class has been deprecated.
Use
com.atlassian.jira.testkit.client.restclient.ParsedResponseinstead.com.atlassian.jira.testkit.client.RestApiClient#toResponse()acceptsRestCallfunctional interface.Use new
RestCallinterface or lambda in place ofMethodinterface.com.atlassian.jira.avatar.AvatarManagerÂ
#getAvatarBaseDirectoryremoved.Use
#readAvatarData()to access avatar data directly.com.atlassian.jira.util.AttachmentConfigWhole classes removed.
Use
AttachmentConfigManager#getTemporaryAttachmentDirectory()instead.com.atlassian.jira.issue.attachment.AttachmentStoreWhole classes removed.
Use alternative methods provided by:
AttachmentManagerThumbnailManagerAttachmentConfigManagercom.atlassian.jira.util.AttachmentUtilsWhole classes removed.
To create, read, or delete attachment and thumbnail data directly, use the methods available in
AttachmentManagerandThumbnailManager.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:
AttachmentManagerThumbnailManager.getAttachmentStore()-AttachmentStorehas been removed.Instead of
getTemporaryAttachmentDirectory(), useAttachmentConfigManager#getTemporaryAttachmentDirectory().Instead of
getAttachmentFileandgetThumbnailFilemethods, useAttachmentManagerandThumbnalManager. For exampleAttachmentManager#streamAttachmentContent.The following checks can be omitted:
checkValidAttachmentDirectoryandcheckValidTemporaryAttachmentDirectory. Jira checks the validity of paths during startup.AttachmentManager#attachmentsEnabled()removed.Use
AttachmentConfigManager#isAttachmentsEnabled()instead.AttachmentManager#disableAttachments()removed.No replacement.
AttachmentManager#createAttachmentCopySourceFileand previously deprecated overloads of#createAttachmentremoved.Use
#createAttachment(CreateAttachmentParamsBean)instead.com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean#CreateAttachmentParamsBeanremoved.Use the provided builder
com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean.Builderinstead.AttachmentManager#deleteAttachmentDirectory(Issue)removed.To delete an issue, use
IssueManager#deleteIssueinstead.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#issuePropertiesnow acceptsMap<String, String>Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.issue.util.IssueUpdateBean#getPropertiesnow returnsMap<String, String>#addPropertiesnow acceptsMap<String, String>Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.CreateValidationResultconstructor now accepts
Map<String, String>#getPropertiesnow returnsMap<String, String>Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.UpdateValidationResultconstructornow acceptsMap<String, String>#getPropertiesnow returnsMap<String, String>Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.configurable.ObjectConfigurationFactory#loadObjectConfigurationFromElementnow acceptscom.atlassian.plugin.module.Elementinstead oforg.dom4j.ElementUse the new type in method calls.
com.atlassian.jira.issue.fields.rest.IssueFinderV2#findIssue(String) now returns
io.atlassian.fugue.Eitherinstead ofcom.atlassian.fugue.EitherReplaced class is equivalent.
com.atlassian.jira.config.utilAttachmentPathManagerWhole class removed.
Use the methods available in
AttachmentManagerto create/read/delete attachment data directly. For the settings related methods, use the new endpoints provided inAttachmentConfigManager.com.atlassian.jira.testkit.client.AttachmentsControlcom.atlassian.jira.testkit.plugin.AttachmentsBackdoor)Whole classes removed.
Use
com.atlassian.jira.functest.framework.backdoor.AttachmentFileControlinjira-func-tests(which requires thejira-func-test-pluginto be installed). It provides storage-agnostic alternative methods to allow copying and clearing attachments.com.atlassian.jira.bc.dataimport.DataImportParamsÂ
#isUseDefaultPathsBuilder#setUseDefaultPathsThis 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.UserResourceUse
PUT /rest/api/2/user/avatarprovided bycom.atlassian.jira.rest.v2.issue.UserResource#updateUserAvatarinstead.Removed private endpoint
GET globalconfig/1/issuecustomfields/{issue}provided bycom.atlassian.jira.projectconfig.rest.global.IssueCustomFieldsResource#getAffectedProjectsNo replacement.
Removed private endpoint
POST globalconfig/1/customfieldoptions/{customFieldId}/provided bycom.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsUse
POST globalconfig/1/customfieldoptions/{customFieldId}/setOptionsprovided bycom.atlassian.jira.projectconfig.rest.global.CustomFieldOptionsResource#setOptionsForCustomFieldinstead./greenhopper/1.0/api/sprints/{sprintId}/remotelinkprovided bycom.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createOrUpdateRemoteSprintLinkUse
greenhopper/1.0/api/sprints/{sprintId}/remotelinkcheckedprovided bycom.atlassian.greenhopper.web.api.RemoteSprintLinkResource#createRemoteSprintLinkCheckedinstead.Removed public endpoints:
GETÂ /rest/api/2/auditing/recordPOSTÂ /rest/api/2/auditing/recordUse the following endpoints instead:
GET /rest/auditing/1.0/eventsGET /rest/auditing/1.0/configuration/coverageGET /rest/auditing/1.0/configuration/retentionGET /rest/auditing/1.0/configuration/retention/fileRemoved public endpoint
GET /rest/api/2/groupprovided bycom.atlassian.jira.rest.v2.issue.GroupResource#getGroupUse
GET /rest/api/2/group/memberprovided 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}/removeAndSwapprovided bycom.atlassian.jira.rest.v2.issue.VersionResource#delete(String, DeleteAndReplaceVersionBean).Note that the replacement endpoint doesn't publish the
jira:version_mergedwebhook event.JIRA SERVICE MANAGEMENT Removed
GET /servicedeskapi/queues/{projectKey}Use
GET /servicedeskapi/admin/queues/{projectKey}instead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/include-countUse
PUT /servicedeskapi/admin/queues/include-countinstead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/{projectKey}/include-countÂ
Use
PUT /servicedeskapi/admin/queues/{projectKey}/include-countinstead.JIRA SERVICE MANAGEMENT Removed
PUT /servicedeskapi/queues/cache-countUse
PUT /servicedeskapi/admin/queues/cache-countinstead.JIRA SERVICE MANAGEMENTRemoved
PUT /servicedeskapi/queues/{projectKey}/cache-countUse
PUT /servicedeskapi/admin/queues/{projectKey}/cache-countinstead.The
GET rest/api/2/serverInfoendpoint no longer supports the doHealthCheck parameter and does not include the healthChecks field in the response.Use
jira-healthcheck-plugininstead.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:nekohtmlorg.cyberneko.htmlorg.cyberneko.html.*commons-validator:commons-validatororg.apache.commons.validatororg.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_10io.atlassian.fugue:fugue-scalaio.atlassian.fugue.converterscommons-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.juliorg.apache.juli.loggingorg.apache.tomcat:*org.apache.tomcatorg.apache.catalinaorg.apache.tika:tika-coreorg.apache.tika:tika-*org.apache.tikaorg.apache.tika.*org.apache.xmlgraphics:batik-transcoderorg.apache.xmlgraphics:batik-codecorg.apache.xmlgraphics:batik-jsorg.apache.xmlgraphics:batik-svggenorg.apache.xmlgraphics:foporg.apache.batikorg.apache.batik.*com.querydsl:querydsl-corecom.querydsl:querydsl-sqlcom.mysema.commons.langcom.querydsl.corecom.querydsl.core.*commons-configuration:commons-configurationorg.apache.commons.configurationorg.apache.commons.configuration.beanutilsorg.apache.commons:commons-collections4org.apache.commons.collections4com.thoughtworks.xstream:xstreamcom.thoughtworks.xstreamcom.thoughtworks.xstream.*org.apache.commons:commons-dbcp2org.apache.commons.dbcp2org.apache.commons.dbcp2.cpdsadapterorg.apache.commons.dbcp2.datasourcesorg.apache.commons.dbcp2.managedcom.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.jdkorg.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.apicommons-beanutils:commons-beanutilsorg.apache.commons.beanutilsorg.apache.commons.beanutils.*org.apache.commons:comons-compressorg.apache.commons.compressorg.apache.commons.compress.*com.sun:jai_corecom.sun.media.jai.*javax.media.jaijavax.media.jai.*com.sun:jai_codeccom.sun.media.jai.*wsdl4j:wsdl4jcom.ibm.wsdlcom.ibm.wsdl.*javax.wsdljavax.wsdl.*com.atlassian.fugue:fuguecom.atlassian.fugue.*org.dom4j:dom4jorg.dom4j.*Â
Removal of binary installers
Starting from Jira 10.0, the
.binand.exeinstallers will no longer be available. You can still install Jira using the.zipand.tar.gzdistributions.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
createdcolumn in thechangegroup,jiraissue, andjiraactiontables 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-legacymodule. 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-visiblewere already empty web resources, while theregenerator-runtimewas 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:jqueryorcom.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
NoSuchMethodExceptionand 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
pompackaging 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
importscope. 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-projectdependency management import.Add
jira-api-bomas a dependency with scopeimport.Consider adding
jira-deprecated-api-bomif 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 containscopedefinition, 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
versionfield 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:
.binand.exebinary 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
Acceptheader 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