We’ve removed the following REST API endpoints in the Jira Service Management 10.0.
Change
Instructions
Removed GET /servicedeskapi/queues/{projectKey}
Use GET /servicedeskapi/admin/queues/{projectKey}
Removed
PUT /servicedeskapi/queues/include-count
Use PUT /servicedeskapi/admin/queues/include-count
Removed PUT /servicedeskapi/queues/{projectKey}/include-count
Use PUT /servicedeskapi/admin/queues/{projectKey}/include-count
Removed PUT /servicedeskapi/queues/cache-count
Use PUT /servicedeskapi/admin/queues/cache-count
Removed PUT /servicedeskapi/queues/{projectKey}/cache-count
Use PUT /servicedeskapi/admin/queues/{projectKey}/cache-count
Removal of the http-builder library
For: ADMINS
We’ve removed the http-library in Jira Service Management 10.0 because it is not being actively maintained. If you are using this library in Groovy scripts, we recommend that you switch to the native Groovy GET and POST methods.
Groovy 4 upgrade
For: ADMINS
We’ve upgraded from Groovy 2 to Groovy 4 in Jira Service Management 10.0 for better security, functionality, and syntax support. If you’ve been using Groovy scripts in Assets, test your existing scripts in a non-production environment to make sure your scripts work properly.
Here’s some of the important breaking changes:
Changes to the syntax of the switch statement.
Changes to the syntax of the intersect() method on arrays.
picocli package is no longer bundled, use an extra @Grab instead.
ImportCustomizer is applied once per module (previously it was applied once per class).
groovy-jaxb, groovy-bsf, and StaticTypeCheckingVisitor#collectAllInterfacesByName modules are no longer available.
Antlr2 based parse is no longer available (use the new Parrot parser).
Changes to the formatting of some CLI help messages.
If you run into the following issue with JsonSlurper, replace JsonSlurper with JacksonObjectMapper.
java.lang.RuntimeException: Unable to load FastStringService
at org.apache.groovy.json.internal.FastStringUtils.getService(FastStringUtils.java:56) ~[?:?]
at org.apache.groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:66) ~[?:?]
at org.apache.groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:114) ~[?:?]
at groovy.json.JsonSlurper.parseText(JsonSlurper.java:205) ~[?:?]
The following table lists the changes to the names of classes, packages, and modules.
Types for sourceCache and classCache have changed from Map to stronger types
Expected downtime due to database upgrade in Jira Software 10.0 and Jira Service Management 6.0
For: ADMINS
We’re changed the structure of MySQL and Oracle databases in Jira Software 10.0 and Jira Service Management 6.0 to enhance the accuracy of timestamps for operations, down to the millisecond (operations such as creating issues, updating comments, or changing statuses).
If you’re using a MySQL or Oracle database, you’ll notice an additional upgrade downtime as some columns from the jiraissue, jiraaction, and changegroup tables will be migrated during the upgrade. We expect this downtime to be less than 20 minutes if you have fewer than five million issues. Note that the downtime will be proportional to your database performance, size, and the row count in the jiraissue, jiraaction, and changegroup tables.
To get an accurate estimate and plan your upgrade:
Find the row counts by running the following commands in your database:
SELECT COUNT(*) FROM jiraissue;
SELECT COUNT(*) FROM jiraaction;
SELECT COUNT(*) FROM changegroup;
Use the following benchmark data provided for Amazon RDS db.m6g.8xlarge and estimate your downtime:
jiraissue table: approximately 26.527 seconds per million rows
jiraaction table: approximately 7.592 seconds per million rows
changegroup table: approximately 9.468 seconds per million rows
For example, if you have 5 million, 8 million, and 80 million rows in the jiraissue, jiraaction, and changegroup tables respectively, you can expect a downtime of about 16.65 minutes.
Removal of internal GraphQL APIs in Assets
For: ADMINS
We have removed the internal Assets GraphQL APIs to enhance security, establish consistent API patterns across Jira Service Management and Assets, and to clean up our code base. We’ve migrated the APIs that are used to configure Assets icons to new internal REST endpoints.
We’ll be removing the following:
GraphQL endpoint /insight/graphql
GraphQL queries:
Query name
Description
findObjectSchemas
Find object schemas for provided filter. If no filter is provided, all object schemas will be returned.
objectSchema
Get an object schema by its ID
findObjectTypes
Find object types for provided filter. If no filter is provided, all object types will be returned.
findObjectTypeRelations
Find related object types
objectType
Get an object type by its ID
icon
Get an icon by its ID
globalIconTheme
Get the global icon theme
findObjects
Find objects for provided filter. If no filter is provided, all objects will be returned.
findObjectReferences
Find inbound and outbound references for the given object
findStatusTypes
Find status types for provided the filter. If no filter is provided, all object status types will be returned.
findReferenceTypes
Find reference types for the provided filter
object
Get an object by its ID
findObjectTypeAttributes
Find object type attributes for provided filter. If no filter is provided, all object type attributes will be returned.
objectTypeAttribute
Get an object type attribute by its ID
findUniqueObjectAttributeValues
Find unique object attribute values for a given object type attribute
GraphQL mutations:
Mutation name
Description
createObjectSchema
Create a new object schema
updateObjectSchema
Update an existing object schema's name or description
copyObjectSchema
Copy an existing object schema
deleteObjectSchema
Delete an existing object schema
createObjectType
Create a new object type
updateObjectType
Update an existing object type
updateObjectTypePosition
Change the position of an object type in the object types structure
copyObjectType
Copy an existing object type
deleteObjectType
Delete an existing object type
createObject
Create a new object
updateObject
Update an existing object
deleteObject
Delete an existing object
createObjectTypeAttribute
Create a new object type attribute
updateObjectTypeAttribute
Update an existing object type attribute
configureObjectTypeAttribute
Change configuration of the object type attribute
updateObjectTypeAttributePosition
Change the position of an object type attribute in attribute list
deleteObjectTypeAttribute
Delete an existing object type attribute
createIcon
Create new icon
updateIcon
Update an existing icon
deleteIcon
Delete an existing icon
configureGlobalIconTheme
Configure the global icon theme
resetGlobalIconTheme
Reset the global icon theme to its default configuration
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.
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.
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.
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.
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.
Is there a way to customize or override the Jackson ObjectMapper used in plugin REST v2?
Currently it’s not possible for plugins to customize REST’s ObjectMapper config.
We encountered some issues regarding our REST endpoints that use the @Autowired annotation on the constructor. That results in warnings like:
MultiException stack 1 of 2 java.lang.NoSuchMethodException: Could not find a suitable constructor in de.resolution.usersync.rest.NotificationRestResource class.
This can be mitigated using @Inject instead.
However, to our knowledge, both annotations should work the same. Was this an intentional change?
This was an intentional change. REST resource classes are instantiated by HK2 in Jersey 2, hence Spring’s @Autowired won't work.
Which Testkit should I use?
Use the 10.0.3 jira-testkit.
My method invocations are blocked, even though I have them allowlisted. Why?
Plugins may define their own allowlist using this module descriptor which will supplement the global allowlist. Plugins can only define allowlist entries for their own classes.
It looks like REST v2 in the latest EAP supports only @Inject (javax.inject.Inject) for resource constructors and doesn’t support the Spring @Autowired annotation. Is this intentional?
Yes, this is intentional. We dropped support for the Spring @Autowired annotation and decided to migrate to @Inject (javax.inject.Inject), because @Autowired is Spring-specific and javax.inject.Inject is part of a standard (Java EE / Jakarta EE - JSR-330). Relying on the standard rather than on a specific implementation provides us with more options for the future.
We’re currently testing Jira 10.0 and the AITs Arquillian didn't work with JDK 17, any idea why?
All the tests work with JDK 8 or JDK 9, and when I change to JDK 17, the tests don't start.
The error:
java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:958) at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:392) at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.execute(ServletMethodExecutor.java:173) at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor$1.run(ServletMethodExecutor.java:221) at java.base/java.util.TimerThread.mainLoop(Timer.java:566) at java.base/java.util.TimerThread.run(Timer.java:516) andjava.lang.IllegalStateException: Error launching test at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.invoke(ServletMethodExecutor.java:100) at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:103) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:62) at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:52) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed
Check Jira logs. invalid stream header is usually an indicator that test “plugin” has failed to install.
This library is effectively no longer maintained as it's not really used internally at Adaptavist anymore.
What version of atlassian-plugins will this release ship with? We need version 8.0.15+ for our app to run as we utilize new APIs.
atlassian-plugins will be version 8.0.15 in the new release.
“The global object GH.RapidBoard is deprecated.” — what does it mean?
Will the GH be removed? Will there be a way to access it?
We’re not planning to remove global variables in this platform release (10.0.0). At the same time, we’re committed to reducing the tech debt and introducing improvements to the Jira front-end tech stack and UI. Global variables tend to be an obstacle in such projects. We communicated the long-term take on global variables in Preparing for Jira 8.0.1 and reinforced that message later too.
The most recent effort in that area was in JSW 9.7.1.
You can read more about the migration from global variables to AMD modules on this page. It was published in 2019 but the gist is intact. These are the key points:
All supported functionality should be already available in a form of AMD modules (vs. global variables).
All possible usage of globals is considered as deprecated and developers should have a plan to move to alternative solutions (AMD modules).
Global variables that provide support for supported functionality will be removed only when an alternative solution for that piece of functionality is in place, and with proper notice beforehand. We may remove globals without the alternative solution in place for unsupported functionality, in platform releases, or for security reasons.
We cannot promise that in the future all AMD modules will be a part of the API.
Once we decide to remove a particular subset of globals, we will provide a detailed migration documentation, containing removed globals list and their AMD module names equivalents.
Upgrade procedure
To help you upgrade to the latest and greatest:
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> Applications > 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_12666Jira Service Management 10.0.x upgrade notes
Upgrade notes
Removal of REST API endpoints
For: ADMINS
We’ve removed the following REST API endpoints in the Jira Service Management 10.0.
Removed
GET /servicedeskapi/queues/{projectKey}GET /servicedeskapi/admin/queues/{projectKey}Removed
PUT /servicedeskapi/queues/include-countPUT /servicedeskapi/admin/queues/include-countPUT /servicedeskapi/queues/{projectKey}/include-countPUT /servicedeskapi/admin/queues/{projectKey}/include-countPUT /servicedeskapi/queues/cache-countPUT /servicedeskapi/admin/queues/cache-countPUT /servicedeskapi/queues/{projectKey}/cache-countPUT /servicedeskapi/admin/queues/{projectKey}/cache-countRemoval of the http-builder library
For: ADMINS
We’ve removed the http-library in Jira Service Management 10.0 because it is not being actively maintained. If you are using this library in Groovy scripts, we recommend that you switch to the native Groovy GET and POST methods.
Groovy 4 upgrade
For: ADMINS
We’ve upgraded from Groovy 2 to Groovy 4 in Jira Service Management 10.0 for better security, functionality, and syntax support. If you’ve been using Groovy scripts in Assets, test your existing scripts in a non-production environment to make sure your scripts work properly.
Here’s some of the important breaking changes:
switchstatement.intersect()method on arrays.picoclipackage is no longer bundled, use an extra@Grabinstead.ImportCustomizeris applied once per module (previously it was applied once per class).groovy-jaxb,groovy-bsf, andStaticTypeCheckingVisitor#collectAllInterfacesByNamemodules are no longer available.If you run into the following issue with
JsonSlurper, replaceJsonSlurperwithJacksonObjectMapper.The following table lists the changes to the names of classes, packages, and modules.
For the full list of breaking changes, check out:
Groovy 3.0 release notes
Groovy 4.0 release notes
groovy.utilgroovy.xmlgroovy.xml.QNamegroovy.namespacegroovy.utilgroovy.antgroovy.inspectgroovy.consolegroovy.inpsect.swinguigroovy.uigroovy.console.uigroovy.ui.ConsoleAppletorg.codehaus.groovy.tools.shellorg.apache.groovy.groovyshgroovy.util.GroovyMBeangroovy.jmxorg.codehaus.groovy.runtime.NioGroovyMethodsorg.apache.groovy.nio.extensions.NioExtensionsorg.codehaus.groovy.runtime.WritablePathorg.apache.groovy.nio.runtimeorg.codehaus.groovy.bindingorg.apache.groovy.swing.bindinggroovy.modelgroovy.swing.modelgroovy.inspect.swinguiorg.apache.groovy.swing.tableorg.codehaus.groovy.runtime.ScriptTestAdapterorg.apache.groovy.testgroovy.transform.NotYetImplementedgroovy.test.NotYetImplementedgroovy.utilgroovy.testgroovy.langgroovy.testsourceCacheandclassCachehave changed fromMapto stronger typesExpected downtime due to database upgrade in Jira Software 10.0 and Jira Service Management 6.0
For: ADMINS
We’re changed the structure of MySQL and Oracle databases in Jira Software 10.0 and Jira Service Management 6.0 to enhance the accuracy of timestamps for operations, down to the millisecond (operations such as creating issues, updating comments, or changing statuses).
If you’re using a MySQL or Oracle database, you’ll notice an additional upgrade downtime as some columns from the
jiraissue,jiraaction, andchangegrouptables will be migrated during the upgrade. We expect this downtime to be less than 20 minutes if you have fewer than five million issues. Note that the downtime will be proportional to your database performance, size, and the row count in thejiraissue,jiraaction, andchangegrouptables.To get an accurate estimate and plan your upgrade:
Find the row counts by running the following commands in your database:
jiraissuetable: approximately 26.527 seconds per million rowsjiraactiontable: approximately 7.592 seconds per million rowsFor example, if you have 5 million, 8 million, and 80 million rows in the
jiraissue,jiraaction, andchangegrouptables respectively, you can expect a downtime of about 16.65 minutes.Removal of internal GraphQL APIs in Assets
For: ADMINS
We have removed the internal Assets GraphQL APIs to enhance security, establish consistent API patterns across Jira Service Management and Assets, and to clean up our code base. We’ve migrated the APIs that are used to configure Assets icons to new internal REST endpoints.
We’ll be removing the following:
/insight/graphqlGraphQL queries:
findObjectSchemasFind object schemas for provided filter. If no filter is provided, all object schemas will be returned.
objectSchemaGet an object schema by its ID
findObjectTypesFind object types for provided filter. If no filter is provided, all object types will be returned.
findObjectTypeRelationsFind related object types
objectTypeGet an object type by its ID
iconGet an icon by its ID
globalIconThemeGet the global icon theme
findObjectsFind objects for provided filter. If no filter is provided, all objects will be returned.
findObjectReferencesFind inbound and outbound references for the given object
findStatusTypesFind status types for provided the filter. If no filter is provided, all object status types will be returned.
findReferenceTypesFind reference types for the provided filter
objectGet an object by its ID
findObjectTypeAttributesFind object type attributes for provided filter. If no filter is provided, all object type attributes will be returned.
objectTypeAttributeGet an object type attribute by its ID
findUniqueObjectAttributeValuesFind unique object attribute values for a given object type attribute
GraphQL mutations:
createObjectSchemaCreate a new object schema
updateObjectSchemaUpdate an existing object schema's name or description
copyObjectSchemaCopy an existing object schema
deleteObjectSchemaDelete an existing object schema
createObjectTypeCreate a new object type
updateObjectTypeUpdate an existing object type
updateObjectTypePositionChange the position of an object type in the object types structure
copyObjectTypeCopy an existing object type
deleteObjectTypeDelete an existing object type
createObjectCreate a new object
updateObjectUpdate an existing object
deleteObjectDelete an existing object
createObjectTypeAttributeCreate a new object type attribute
updateObjectTypeAttributeUpdate an existing object type attribute
configureObjectTypeAttributeChange configuration of the object type attribute
updateObjectTypeAttributePositionChange the position of an object type attribute in attribute list
deleteObjectTypeAttributeDelete an existing object type attribute
createIconCreate new icon
updateIconUpdate an existing icon
deleteIconDelete an existing icon
configureGlobalIconThemeConfigure the global icon theme
resetGlobalIconThemeReset the global icon theme to its default configuration
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.ProjectRoleBeaninstead.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.JiraWebActionSupportThe class is now abstract.
Extend the class to provide your implementation.
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
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.
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.
End of support announcements
We’ve removed support for:
.binand.exebinary installersWe’ve unbundled:
Java (due to the binary installers removal)
For the list of supported platforms, check Supported platforms.
For previous announcements, see End of support announcements.
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 10.0, we’ve prepared a list of frequently asked questions.
Question
Answer
Is there a way to customize or override the Jackson ObjectMapper used in plugin REST v2?
Currently it’s not possible for plugins to customize REST’s ObjectMapper config.
We encountered some issues regarding our REST endpoints that use the @
Autowiredannotation on the constructor. That results in warnings like:MultiException stack 1 of 2 java.lang.NoSuchMethodException: Could not find a suitable constructor in de.resolution.usersync.rest.NotificationRestResource class.This can be mitigated using @
Injectinstead.However, to our knowledge, both annotations should work the same. Was this an intentional change?
This was an intentional change. REST resource classes are instantiated by HK2 in Jersey 2, hence Spring’s
@Autowiredwon't work.Which Testkit should I use?
Use the 10.0.3
jira-testkit.My method invocations are blocked, even though I have them allowlisted. Why?
Plugins may define their own allowlist using this module descriptor which will supplement the global allowlist. Plugins can only define allowlist entries for their own classes.
More details: Configuring the Velocity method allowlist
It looks like REST v2 in the latest EAP supports only @
Inject(javax.inject.Inject) for resource constructors and doesn’t support the Spring @Autowiredannotation. Is this intentional?Yes, this is intentional. We dropped support for the Spring
@Autowiredannotation and decided to migrate to@Inject(javax.inject.Inject), because@Autowiredis Spring-specific andjavax.inject.Injectis part of a standard (Java EE / Jakarta EE - JSR-330). Relying on the standard rather than on a specific implementation provides us with more options for the future.We’re currently testing Jira 10.0 and the AITs Arquillian didn't work with JDK 17, any idea why?
All the tests work with JDK 8 or JDK 9, and when I change to JDK 17, the tests don't start.
The error:
java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:958) at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:392) at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.execute(ServletMethodExecutor.java:173) at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor$1.run(ServletMethodExecutor.java:221) at java.base/java.util.TimerThread.mainLoop(Timer.java:566) at java.base/java.util.TimerThread.run(Timer.java:516) andjava.lang.IllegalStateException: Error launching test at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.invoke(ServletMethodExecutor.java:100) at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:103) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:62) at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:52) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceedCheck Jira logs.
invalid stream headeris usually an indicator that test “plugin” has failed to install.This library is effectively no longer maintained as it's not really used internally at Adaptavist anymore.
There is a suggested workaround here: java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A error in some Arqullian testsbug
What version of
atlassian-pluginswill this release ship with? We need version 8.0.15+ for our app to run as we utilize new APIs.atlassian-pluginswill be version 8.0.15 in the new release.“The global object GH.RapidBoard is deprecated.” — what does it mean?
Will the GH be removed? Will there be a way to access it?
We’re not planning to remove global variables in this platform release (10.0.0). At the same time, we’re committed to reducing the tech debt and introducing improvements to the Jira front-end tech stack and UI. Global variables tend to be an obstacle in such projects. We communicated the long-term take on global variables in Preparing for Jira 8.0.1 and reinforced that message later too.
The most recent effort in that area was in JSW 9.7.1.
You can read more about the migration from global variables to AMD modules on this page. It was published in 2019 but the gist is intact. These are the key points:
All supported functionality should be already available in a form of AMD modules (vs. global variables).
All possible usage of globals is considered as deprecated and developers should have a plan to move to alternative solutions (AMD modules).
Global variables that provide support for supported functionality will be removed only when an alternative solution for that piece of functionality is in place, and with proper notice beforehand. We may remove globals without the alternative solution in place for unsupported functionality, in platform releases, or for security reasons.
We cannot promise that in the future all AMD modules will be a part of the API.
Once we decide to remove a particular subset of globals, we will provide a detailed migration documentation, containing removed globals list and their AMD module names equivalents.
Upgrade procedure
To help you upgrade to the latest and greatest:
View full product version
Link to comment
https://beta.jimiwikman.se/forums/topic/12320-jira-service-management-100/Share on other sites