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.
Jira 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-count
PUT /servicedeskapi/admin/queues/include-count
PUT /servicedeskapi/queues/{projectKey}/include-count
PUT /servicedeskapi/admin/queues/{projectKey}/include-count
PUT /servicedeskapi/queues/cache-count
PUT /servicedeskapi/admin/queues/cache-count
PUT /servicedeskapi/queues/{projectKey}/cache-count
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:
switch
statement.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
, andStaticTypeCheckingVisitor#collectAllInterfacesByName
modules are no longer available.If you run into the following issue with
JsonSlurper
, replaceJsonSlurper
withJackson
ObjectMapper
.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.util
groovy.xml
groovy.xml.QName
groovy.namespace
groovy.util
groovy.ant
groovy.inspect
groovy.console
groovy.inpsect.swingui
groovy.ui
groovy.console.ui
groovy.ui.ConsoleApplet
org.codehaus.groovy.tools.shell
org.apache.groovy.groovysh
groovy.util.GroovyMBean
groovy.jmx
org.codehaus.groovy.runtime.NioGroovyMethods
org.apache.groovy.nio.extensions.NioExtensions
org.codehaus.groovy.runtime.WritablePath
org.apache.groovy.nio.runtime
org.codehaus.groovy.binding
org.apache.groovy.swing.binding
groovy.model
groovy.swing.model
groovy.inspect.swingui
org.apache.groovy.swing.table
org.codehaus.groovy.runtime.ScriptTestAdapter
org.apache.groovy.test
groovy.transform.NotYetImplemented
groovy.test.NotYetImplemented
groovy.util
groovy.test
groovy.lang
groovy.test
sourceCache
andclassCache
have changed fromMap
to 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
, andchangegroup
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 thejiraissue
,jiraaction
, andchangegroup
tables.To get an accurate estimate and plan your upgrade:
Find the row counts by running the following commands in your database:
jiraissue
table: approximately 26.527 seconds per million rowsjiraaction
table: approximately 7.592 seconds per million rowsFor example, if you have 5 million, 8 million, and 80 million rows in the
jiraissue
,jiraaction
, andchangegroup
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:
/insight/graphql
GraphQL queries:
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:
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:
com.atlassian.jira.agile.darkfeature.burnupchart
optimistic.transitions
com.atlassian.jira.advanced.audit.log
velocity.chart.ui
jira.quick.search
com.atlassian.jira.custom.csv.escaper
atlassian.cdn.static.assets
jira.users.and.roles.page.in.react
All features previously hidden behind those feature flags were enabled by default.
Breaking changes to the Java API
In this release, we've removed several deprecated methods and classes. Additionally, we’ve made adjustments to a group of methods which involved modifying the signatures and return types.
Here’s what’s been changed:
Classes
Changed symbols
Instructions
com.atlassian.jira.issue.customfields.CustomFieldType
#getNonnullCustomFieldProvider()
removed.Use
#getNonNullCustomFieldProvider()
instead.com.atlassian.jira.issue.customfields.vdi.NonNullCustomFieldProvider
com.atlassian.jira.issue.customfields.DefaultNonNullCustomFieldProvider
#getCustomFieldInfo(com.atlassian.jira.issue.Issue)
removed.Use
#getCustomFieldInfo(java.util.List issues)
instead.You now need to implement
#getCustomFieldInfo(java.util.List<com.atlassian.jira.issue.Issue> issues)
in every class you were previously implementing#getCustomFieldInfo(com.atlassian.jira.issue.Issue issue)
.com.atlassian.jira.issue.customfields.NonnullCustomFieldProvider
com.atlassian.jira.issue.customfields.persistence.DefaultNonnullCustomFieldProvider
com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData
Whole classes removed.
Use
com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData
instead.com.atlassian.jira.issue.index.indexers.FieldIndexer
com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
com.atlassian.jira.issue.customfields.impl.TextCFType
#addIndex(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData)
removed.Use
#addIndex(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
#addDocumentFieldsNotSearchable(org.apache.lucene.document.Document doc, com.atlassian.jira.issue.Issue issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData prefetchedData)
removed.Use
#addDocumentFieldsNotSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer
#addDocumentFieldsSearchable(org.apache.lucene.document.Document doc, com.atlassian.jira.issue.Issue issue, com.atlassian.jira.issue.customfields.CustomFieldPrefetchedData prefetchedData)
removed.Use
#addDocumentFieldsSearchable(org.apache.lucene.document.Document, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.customfields.vdi.CustomFieldPrefetchedData)
instead.com.atlassian.jira.bc.user.search.UserSearchParams
All public constructors removed.
Use
UserSearchParams.Builder
to construct an instance ofUserSearchParams
instead of using the constructor.com.atlassian.jira.bc.user.search.UserSearchParams
#builder()
behavior changed.The behavior of this method changed, it was left for convenience. It now mirrors the behavior of
UserSearchParams.builder(MAXIMUM_RESULTS)
.com.atlassian.jira.util.collect.CollectionUtil
#filter(Collection<T>, Predicate<? super T>)
removed.Use standard
Stream#filter(Predicate<?>)
and appropriateStream#collect(...)
call.com.atlassian.jira.security.GlobalPermissionEntry
#getGlobalPermissionType()
removed.Use
#getPermissionKey()
instead.com.atlassian.jira.security.JiraAuthenticationContext
#getI18nBean()
removed.Use
#getI18nHelper()
instead.com.atlassian.jira.security.JiraAuthenticationContext
#getText(java.lang.String)
removed.Use
#getText()
method on#getI18nHelper()
.com.atlassian.jira.sharing.ShareManager
#hasPermission(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.sharing.SharedEntity)
removed.Use
#isSharedWith(com.atlassian.crowd.embedded.api.User, SharedEntity)
to get the same logic. Permission checks should be done in the service layer according to this information.com.atlassian.jira.user.preferences.JiraUserPreferences
Whole class removed from public API.
You should not construct user preferences directly. Request them through the
UserPreferencesManager
instead.com.atlassian.jira.util.collect.MapBuilder
#toFastMap()
removed.Use
ImmutableMap
directly instead.com.atlassian.jira.util.collect.MapBuilder
#toImmutableMap()
removed.Use
#toMap()
instead, or consider usingImmutableMap
if the map doesn't need to accept nulls.com.atlassian.jira.util.index.Contexts
#nullContext()
removed.Use
com.atlassian.jira.task.context.Contexts#nullContext()
instead.com.atlassian.jira.util.JiraDurationUtils
#onClearCache(com.atlassian.jira.event.ClearCacheEvent)
removed.Use the
DurationFormatChanged
event instead.com.atlassian.jira.util.JiraDurationUtils
#start()
removed.No replacement.
com.atlassian.jira.web.action.issue.IssueCreationHelperBean
#getProvidedFieldNames(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue)
removed.Avoid using
IssueCreationHelperBean
class as it’ll be removed. Before it happens, use#getProvidedFieldNames(com.atlassian.jira.issue.Issue)
instead.com.atlassian.jira.web.bean.MultiBulkMoveBean
#setTargetProject(org.ofbiz.core.entity.GenericValue)
removed.Use
#setTargetProject(com.atlassian.jira.project.Project)
instead.com.atlassian.jira.web.util.HelpUtil.HelpPath
#getSimpleUrl()
removed.Use
#getUrl()
instead.com.atlassian.jira.web.util.OutlookDate
#format()
#getDateTimePickerFormatSample(java.util.Date)
removed.
Use
com.atlassian.jira.datetime.DateTimeFormatter#format(java.util.Date)
instead.com.atlassian.jira.web.util.OutlookDate
#getCompleteDateFormat()
#getDatePickerFormat()
#getDateTimePickerFormat()
removed.
Use
com.atlassian.jira.datetime.DateTimeFormatter#getFormatHint()
instead.com.atlassian.jira.web.util.OutlookDate
#getNow()
removed.Use
java.util.Date#Date()
instead.com.atlassian.jira.permission.SchemePermissions
Whole class removed.
Use
com.atlassian.jira.security.PermissionManager
instead.com.atlassian.jira.permission.Permission
Whole class removed.
Use
com.atlassian.jira.security.PermissionManager
orcom.atlassian.jira.security.GlobalPermissionManager
instead.com.atlassian.jira.issue.attachment.AttachmentZipKit
Whole class removed.
Use
com.atlassian.jira.issue.AttachmentIndexManager
instead.com.atlassian.jira.util.NotNull
(annotation)Whole class removed.
Use
javax.annotation.Nonnull
instead.com.atlassian.jira.security.PermissionManager
including its subclasses:com.atlassian.jira.security.PublicAccessPermissionManager
com.atlassian.jira.security.ApplicationRequiredPermissionManager
com.atlassian.jira.security.DefaultPermissionManager
com.atlassian.jira.security.SubvertedPermissionManager
getProjects(int, com.atlassian.jira.user.ApplicationUser)
getProjects(int permissionId, ApplicationUser user, ProjectCategory projectCategory)
removed.
Use supported
getProjects
method, for example:com.atlassian.jira.security.PermissionManager#getProjects(com.atlassian.jira.security.plugin.ProjectPermissionKey, com.atlassian.jira.user.ApplicationUser)
com.atlassian.jira.security.PermissionManager#getProjects(com.atlassian.jira.security.plugin.ProjectPermissionKey, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.ProjectCategory)
com.atlassian.jira.help.HelpUrlsParser
#defaultUrl(String, String)
#onDemand(boolean)
removed.
Use
com.atlassian.jira.help.HelpUrlsParserBuilderFactory
to construct newHelpUrlsParse
instance.com.atlassian.jira.imports.project.mapper.ProjectImportIdMapper
#getValuesFromImport()
removed.Use
#getRegisteredOldIds()
(and#getKey()
if needed) instead.com.atlassian.jira.imports.project.mapper.ProjectRoleActorMapper
#getAllProjectRoleActors()
removed.Use the properly typed method
#getProjectRoleActors()
instead.com.atlassian.jira.issue.comments.CommentManager
#getProjectRole(java.lang.Long)
removed.Use
com.atlassian.jira.security.roles.ProjectRoleManager#getProjectRole(Long)
instead.com.atlassian.jira.issue.fields.layout.field.FieldLayoutStorageException
Whole class removed.
No replacement
com.atlassian.jira.issue.fields.rest.json.CommentBeanFactory
#createRenderedBean(com.atlassian.jira.issue.comments.Comment)
removed.Use
#createRenderedBean(com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.util.EmailFormatter)
instead.com.atlassian.jira.issue.index.ReindexAllCompletedEvent
#shouldUpdateReplicatedIndex()
#ReindexAllCompletedEvent(long)
#ReindexAllCompletedEvent(long, boolean, boolean)
removed.
Use
#shouldNotifyCluster()
instead.Do not construct internal
ReindexAllCompletedEvent
class.com.atlassian.jira.issue.index.ReindexAllStartedEvent
#shouldUpdateReplicatedIndex()
#ReindexAllStartedEvent()
#ReindexAllStartedEvent(boolean, boolean)
#ReindexAllStartedEvent(boolean, boolean, com.atlassian.jira.issue.index.IssueIndexingParams, com.atlassian.jira.config.ReindexMessage)
removed.
Use
#shouldNotifyCluster()
instead.Don't construct internal
ReindexAllStartedEvent
class.com.atlassian.jira.bc.project.version.VersionService
#delete(JiraServiceContext, ValidationResult)
removed.Use
com.atlassian.jira.bc.project.version.VersionService#deleteVersionAndSwap
instead.com.atlassian.jira.bc.project.version.VersionService
#deleteVersion(ApplicationUser, Version, Option<Version>, Option<Version>)
removed.Use
com.atlassian.jira.project.version.VersionManager#deleteVersionAndSwap
instead.com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult
#getLicenseVersion()
removed.Use
#getLicenseDetails().getLicenseVersion()
instead.com.atlassian.jira.bc.license.JiraLicenseService.ValidationResult
#getTotalUserCount()
removed.Use one of the following:
com.atlassian.jira.application.ApplicationAuthorizationService#getUserCount(ApplicationKey)
com.atlassian.jira.user.util.UserManager#getTotalUserCount()
com.atlassian.jira.bc.portal.PortalPageService
#updatePortalPageUnconditionally(com.atlassian.jira.bc.JiraServiceContext, com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.portal.PortalPage)
removed.Use one of the following:
#updatePortalPageOwner
#updatePortalPage
PortalPageManager#update
com.atlassian.jira.bc.project.version.VersionService
#validateVersionDetails(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String, java.lang.String)
#validateReleaseDate(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.project.version.Version, java.lang.String)
removed.
Use
#validateUpdate(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.bc.project.version.VersionService.VersionBuilder)
instead.com.atlassian.jira.bc.user.UserService
#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser, com.atlassian.application.api.ApplicationKey)
removed.Use
#validateRemoveUserFromApplication(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.user.ApplicationUser,com.atlassian.application.api.ApplicationKey)
instead.com.atlassian.jira.bc.customfield.CustomFieldDefinition
#CustomFieldDefinition()
removed.Use
#builder()
to construct the instance.com.atlassian.jira.bc.issue.comment.CommentService
#isGroupVisiblityEnabled()
renamed to#isGroupVisibilityEnabled()
#isProjectVisiblityEnabled()
renamed to#isProjectRoleVisibilityEnabled()
removed.
Use method with the
visiblity
typo corrected tovisibility
.com.atlassian.jira.bc.issue.comment.CommentService
#isValidCommentData(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String, com.atlassian.jira.util.ErrorCollection)
removed.Use
#isValidCommentVisibility(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, com.atlassian.jira.bc.issue.visibility.Visibility, com.atlassian.jira.util.ErrorCollection)
instead.com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters
#getGroupLevel()
#getRoleLevelId()
removed.
Use the
#getVisibility()
method returning Visibility instance. Example of use that returnsio.atlassian.fugue.Option<String>
instance with appropriate group level value:#getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())
com.atlassian.jira.bc.issue.util.VisibilityValidator
#isProjectRoleVisiblityEnabled()
renamed to#isProjectRoleVisibilityEnabled()
isGroupVisiblityEnabled()
renamed to#isGroupVisibilityEnabled()
removed.
Use methods with the
visiblity
typo corrected tovisibility
.com.atlassian.jira.bc.issue.util.VisibilityValidator
#isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, java.lang.String, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String)
removed.Use
#isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, String, com.atlassian.jira.issue.Issue, com.atlassian.jira.bc.issue.visibility.Visibility)
instead.com.atlassian.jira.bc.issue.worklog.WorklogInputParameters
com.atlassian.jira.bc.issue.worklog.WorklogInputParametersImpl
#getGroupLevel()
#getRoleLevelId()
removed.
Use the
#getVisibility()
method returning Visibility instance.Example of use that returns
io.atlassian.fugue.Option<String>
instance with appropriate group level value:#getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())
com.atlassian.jira.bulkedit.BulkOperationManager
#getBulkOperations()
removed.Use
#getProgressAwareBulkOperations()
instead.com.atlassian.jira.bulkedit.BulkOperationManager
#addBulkOperation(String, Class)
removed.Use #
addProgressAwareBulkOperation(String, Class)
instead.com.atlassian.jira.bulkedit.BulkOperationManager
#getOperation(String)
removed.Use
#getProgressAwareOperation(String)
instead.com.atlassian.jira.bulkedit.operation.BulkOperation
Whole class removed.
Use
com.atlassian.jira.bulkedit.operation.ProgressAwareBulkOperation
instead.com.atlassian.jira.config.ConstantsManager
#storeIssueTypes(java.util.List<org.ofbiz.core.entity.GenericValue>)
removed.Use
#updateIssueType(String, String, Long, String, String, Long)
orrecalculateIssueTypeSequencesAndStore(java.util.List)
instead.com.atlassian.jira.config.properties.LookAndFeelBean
#getVersion()
removed.Use
#getSettingsHash()
to get the state of Look and feel.com.atlassian.jira.config.properties.LookAndFeelBean
#updateVersion(long)
removed.Use
#updateSettingsHash()
instead.com.atlassian.jira.config.SubTaskManager
#insertSubTaskIssueType(java.lang.String, java.lang.Long, java.lang.String, java.lang.String)
removed.Use
#insertSubTaskIssueType(String,Long,String,Long)
instead.com.atlassian.jira.config.SubTaskManager
#updateSubTaskIssueType(java.lang.String, java.lang.String, java.lang.Long, java.lang.String, java.lang.String)
removed.Use
#updateSubTaskIssueType(String,String,Long,String,Long)
instead.com.atlassian.jira.event.issue.IssueWatcherAddedEvent
com.atlassian.jira.event.issue.IssueWatcherDeletedEvent
#getUser()
removed.Use
#getApplicationUser()
insteadcom.atlassian.jira.event.mail.EmailQueueFlashedEvent
Whole class removed.
Use
#com.atlassian.jira.event.mail.EmailQueueFlushedEvent
instead.Deprecated audit API code:
com.atlassian.jira.auditing.AssociatedItem
com.atlassian.jira.auditing.ChangedValue
com.atlassian.jira.auditing.AuditingCategory
com.atlassian.jira.auditing.AuditingFilter
com.atlassian.jira.auditing.RecordRequest
com.atlassian.jira.auditing.AuditRecord
Whole classes removed from public API.
Use the following API code instead:
com.atlassian.audit.entity.AuditResource
com.atlassian.audit.entity.ChangedValue
com.atlassian.jira.auditing.AuditCategory
com.atlassian.audit.api.AuditQuery
com.atlassian.audit.entity.AuditEvent
com.atlassian.audit.entity.AuditEntity
For more details, refer to the migration guide.
com.atlassian.jira.bc.whitelist.WhitelistService
com.atlassian.jira.bc.whitelist.WhitelistManager
Whole classes removed.
Use
com.atlassian.plugins.whitelist.WhitelistService
andcom.atlassian.plugins.whitelist.OutboundWhitelist
instead.com.atlassian.jira.issue.search.managers.IssueSearcherManager
com.atlassian.jira.issue.search.managers.SearchHandlerManager
#getSearcherGroups(com.atlassian.jira.issue.search.SearchContext)
removed.Use
#getSearcherGroups()
instead.com.atlassian.jira.issue.search.managers.SearchHandlerManager
#getSearchersByClauseName(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.issue.search.SearchContext)
removed.Use
#getSearchersByClauseName(com.atlassian.crowd.embedded.api.User,String)
instead.com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper
#getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext)
removed.Use
#getAllIndexValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query)
instead.com.atlassian.jira.issue.search.searchers.util.IndexedInputHelper
#getAllNavigatorValuesForMatchingClauses(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.search.ClauseNames, com.atlassian.query.Query, com.atlassian.jira.issue.search.SearchContext)
removed.Use
#getAllNavigatorValuesForMatchingClauses(ApplicationUser,com.atlassian.jira.issue.search.ClauseNames,com.atlassian.query.Query)
instead.com.atlassian.jira.issue.util.IssueUpdateBean
#getUser()
removed.Use
#getApplicationUser()
instead.com.atlassian.jira.jql.query.AbstractLocalDateOperatorQueryFactory
Whole class removed.
Use
com.atlassian.jira.jql.util.JqlLocalDateSupport#getLocalDatesFromQueryLiterals(java.util.List)
instead.com.atlassian.jira.jql.util.JqlIssueSupport
#getIssues(java.lang.String)
removed.Use
#getIssue(java.lang.String)
instead.com.atlassian.jira.jql.util.JqlIssueSupport
#getIssues(java.lang.String, com.atlassian.jira.user.ApplicationUser)
removed.Use
#getIssue(java.lang.String,com.atlassian.jira.user.ApplicationUser)
instead.com.atlassian.jira.license.LicenseDetails
#getLicenseStatusMessage(com.atlassian.jira.user.ApplicationUser, java.lang.String, com.atlassian.jira.user.util.UserManager)
#getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper, com.atlassian.jira.web.util.OutlookDate, java.lang.String, com.atlassian.jira.user.util.UserManager)
removed.Use
#getLicenseStatusMessage(com.atlassian.jira.util.I18nHelper,UserManager)
instead.com.atlassian.jira.license.LicenseDetails
#isLicenseAlmostExpired()
removed.Use
#getMaintenanceExpiryDate
instead.com.atlassian.jira.mention.MentionService
#sendCommentMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.comments.Comment, com.atlassian.jira.issue.comments.Comment)
removed.Use
#sendCommentMentions(Set,ApplicationUser,Comment,Comment)
instead.com.atlassian.jira.mention.MentionService
#sendIssueCreateMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue)
removed.Use
#sendIssueCreateMentions(Set,ApplicationUser,Issue)
instead.com.atlassian.jira.mention.MentionService
#sendIssueEditMentions(com.atlassian.jira.user.ApplicationUser, java.util.Set<com.atlassian.jira.notification.NotificationRecipient>, com.atlassian.jira.issue.Issue, com.atlassian.jira.issue.comments.Comment)
removed.Use
#sendIssueEditMentions(Set,ApplicationUser,Issue,Comment)
instead.com.atlassian.jira.permission.PermissionSchemeManager
#getEntitiesByType(org.ofbiz.core.entity.GenericValue, com.atlassian.jira.security.plugin.ProjectPermissionKey, java.lang.String)
removed.Use
#getPermissionSchemeEntries(long,com.atlassian.jira.security.plugin.ProjectPermissionKey,String)
instead.com.atlassian.jira.permission.PermissionSchemeManager
#getGroups(java.lang.Long, com.atlassian.jira.project.Project)
removed.Use
#getGroups(ProjectPermissionKey,Project)
instead.com.atlassian.jira.plugin.keyboardshortcut.KeyboardShortcutManager
#getActiveShortcuts()
removed.Use
#listActiveShortcutsUniquePerContext
instead.com.atlassian.jira.plugin.webfragment.conditions.AbstractJiraPermissionCondition
Whole class removed.
Use
AbstractPermissionCondition
instead.com.atlassian.jira.plugin.webfragment.conditions.AbstractPermissionCondition
Whole class removed.
Use
AbstractProjectPermissionCondition
instead.com.atlassian.jira.project.type.ProjectTypesEnabledCondition
Whole class removed.
No replacement.
com.atlassian.jira.issue.table.IssueTable
provided byjira-api
Whole class removed.
Use
com.atlassian.jira.issue.table.IssueTable
provided byjira-issue-nav-plugin
instead.com.atlassian.jira.rest.Dates.DateAdapter
com.atlassian.jira.rest.Dates.DateTimeAdapter
Whole classes removed.
For marshalling and unmarshalling, use the Jackson-friendly serializers and deserializers:
@JsonSerialize(using = Dates.DateSerializer.class)
@JsonDeserialize(using = Dates.DateDeserializer.class)
com.atlassian.jira.rest.v2.issue.project.ProjectRoleBean
Whole classes removed.
Use
com.atlassian.jira.rest.api.project.ProjectRoleBean
instead.com.atlassian.jira.rest.v2.issue.project.RoleActorBean
Whole classes removed.
Use
com.atlassian.jira.rest.api.project.RoleActorBean
instead.com.atlassian.jira.rest.v1.model.ValueCollection
Whole classes removed.
No replacement.
com.atlassian.jira.testkit.client.restclient.Response
provided byjira-testkit-client
The class has been deprecated.
Use
com.atlassian.jira.testkit.client.restclient.ParsedResponse
instead.com.atlassian.jira.testkit.client.RestApiClient
#toResponse()
acceptsRestCall
functional interface.Use new
RestCall
interface or lambda in place ofMethod
interface.com.atlassian.jira.avatar.AvatarManager
#getAvatarBaseDirectory
removed.Use
#readAvatarData()
to access avatar data directly.com.atlassian.jira.util.AttachmentConfig
Whole classes removed.
Use
AttachmentConfigManager#getTemporaryAttachmentDirectory()
instead.com.atlassian.jira.issue.attachment.AttachmentStore
Whole classes removed.
Use alternative methods provided by:
AttachmentManager
ThumbnailManager
AttachmentConfigManager
com.atlassian.jira.util.AttachmentUtils
Whole classes removed.
To create, read, or delete attachment and thumbnail data directly, use the methods available in
AttachmentManager
andThumbnailManager
.To find the temporary attachment directory, use
AttachmentConfigManager#getTemporaryAttachmentDirectory()
.The attachment and thumbnail directories for a particular issue are no longer exposed. Instead, use:
getThumbnailDirectory()
getAttachmentDirectory()
.To manage individual attachments or store other data elsewhere, use:
AttachmentManager
ThumbnailManager
.getAttachmentStore()
-AttachmentStore
has been removed.Instead of
getTemporaryAttachmentDirectory()
, useAttachmentConfigManager#getTemporaryAttachmentDirectory()
.Instead of
getAttachmentFile
andgetThumbnailFile
methods, useAttachmentManager
andThumbnalManager
. For exampleAttachmentManager#streamAttachmentContent
.The following checks can be omitted:
checkValidAttachmentDirectory
andcheckValidTemporaryAttachmentDirectory
. Jira checks the validity of paths during startup.AttachmentManager
#attachmentsEnabled()
removed.Use
AttachmentConfigManager#isAttachmentsEnabled()
instead.AttachmentManager
#disableAttachments()
removed.No replacement.
AttachmentManager
#createAttachmentCopySourceFile
and previously deprecated overloads of#createAttachment
removed.Use
#createAttachment(CreateAttachmentParamsBean)
instead.com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean
#CreateAttachmentParamsBean
removed.Use the provided builder
com.atlassian.jira.issue.attachment.CreateAttachmentParamsBean.Builder
instead.AttachmentManager
#deleteAttachmentDirectory(Issue)
removed.To delete an issue, use
IssueManager#deleteIssue
instead.com.atlassian.jira.issue.IssueInputParameters
#addProperty(String propertyKey, JsonNode propertyValue)
changed to #addProperty(String propertyKey, String propertyValue).#properties()
now returnsMap<String, String>
instead ofMap<String, JsonNode>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.issue.UpdateIssueRequest
#getProperties()
now returnsMap<String, String>
instead of Map<String, JsonNode>#UpdateIssueRequestBuilder#issueProperties
now acceptsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.issue.util.IssueUpdateBean
#getProperties
now returnsMap<String, String>
#addProperties
now acceptsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.CreateValidationResult
constructor now accepts
Map<String, String>
#getProperties
now returnsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.jira.bc.issue.IssueService.UpdateValidationResult
constructor
now acceptsMap<String, String>
#getProperties
now returnsMap<String, String>
Serialize the value before passing to the method and deserialize after reading it.
com.atlassian.configurable.ObjectConfigurationFactory
#loadObjectConfigurationFromElement
now acceptscom.atlassian.plugin.module.Element
instead oforg.dom4j.Element
Use the new type in method calls.
com.atlassian.jira.issue.fields.rest.IssueFinderV2
#findIssue(String) now returns
io.atlassian.fugue.Either
instead ofcom.atlassian.fugue.Either
Replaced class is equivalent.
com.atlassian.jira.config.util
AttachmentPathManager
Whole class removed.
Use the methods available in
AttachmentManager
to create/read/delete attachment data directly. For the settings related methods, use the new endpoints provided inAttachmentConfigManager
.com.atlassian.jira.testkit.client.AttachmentsControl
com.atlassian.jira.testkit.plugin.AttachmentsBackdoor)
Whole classes removed.
Use
com.atlassian.jira.functest.framework.backdoor.AttachmentFileControl
injira-func-tests
(which requires thejira-func-test-plugin
to be installed). It provides storage-agnostic alternative methods to allow copying and clearing attachments.com.atlassian.jira.bc.dataimport.DataImportParams
#isUseDefaultPaths
Builder#setUseDefaultPaths
This option is no longer supported.
com.atlassian.jira.web.action.JiraWebActionSupport
The 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:nekohtml
org.cyberneko.html
org.cyberneko.html.*
commons-validator:commons-validator
org.apache.commons.validator
org.apache.commons.validator.*
com.atlassian.scala.plugins:scala-2.11-provider-plugin
scala.*
com.atlassian.scala.plugins:scala-2.10-provider-plugin
scala.*
com.atlassian.scala.plugins:jackson-module-scala-2.10-provider-plugin
com.fasterxml.jackson.module.scala2_10
io.atlassian.fugue:fugue-scala
io.atlassian.fugue.converters
commons-daemon:commons-daemon
org.apache.commons.daemon.*
org.apache.tomcat:tomcat-coyote
org.apache.coyote.*
commons-el:commons-el
org.apache.commons.el.*
org.apache.tomcat:tomcat-jasper
org.apache.jasper.*
org.apache.tomcat:tomcat-juli
org.apache.juli
org.apache.juli.logging
org.apache.tomcat:*
org.apache.tomcat
org.apache.catalina
org.apache.tika:tika-core
org.apache.tika:tika-*
org.apache.tika
org.apache.tika.*
org.apache.xmlgraphics:batik-transcoder
org.apache.xmlgraphics:batik-codec
org.apache.xmlgraphics:batik-js
org.apache.xmlgraphics:batik-svggen
org.apache.xmlgraphics:fop
org.apache.batik
org.apache.batik.*
com.querydsl:querydsl-core
com.querydsl:querydsl-sql
com.mysema.commons.lang
com.querydsl.core
com.querydsl.core.*
commons-configuration:commons-configuration
org.apache.commons.configuration
org.apache.commons.configuration.beanutils
org.apache.commons:commons-collections4
org.apache.commons.collections4
com.thoughtworks.xstream:xstream
com.thoughtworks.xstream
com.thoughtworks.xstream.*
org.apache.commons:commons-dbcp2
org.apache.commons.dbcp2
org.apache.commons.dbcp2.cpdsadapter
org.apache.commons.dbcp2.datasources
org.apache.commons.dbcp2.managed
com.sun.syndication:com.springsource.com.sun.syndication
com.sun.syndication.feed.*
com.sun.syndication.io.*
rome:rome
com.sun.syndication.feed.*
com.sun.syndication.io.*
commons-discovery:commons-discovery
org.apache.commons.discover.jdk
org.apache.commons.discovery.*
commons-jexl:commons-jexl
org.apache.commons.jexl.*
commons-jrcs:commons-jrcs
org.apache.commons.jrcs.*
com.github.rholder:guava-retrying
com.github.rholder.retry.*
org.dom4j:dom4j
org.dom4j.*
opensymphony:sitemesh
com.opensymphony.module.*
com.opensymphony.sitemesh.*
org.jdom:jdom
org.jdom.*
commons-pool:commons-pool
org.apache.commons.pool.*
org.tuckey:urlrewritefilter
org.tuckey.web.filters.urlrewrite.*
org.springframework.security:spring-security-core
org.springframework.security.*
com.atlassian.p4package:atlassian-p4package
com.perforce.api
commons-beanutils:commons-beanutils
org.apache.commons.beanutils
org.apache.commons.beanutils.*
org.apache.commons:comons-compress
org.apache.commons.compress
org.apache.commons.compress.*
com.sun:jai_core
com.sun.media.jai.*
javax.media.jai
javax.media.jai.*
com.sun:jai_codec
com.sun.media.jai.*
wsdl4j:wsdl4j
com.ibm.wsdl
com.ibm.wsdl.*
javax.wsdl
javax.wsdl.*
com.atlassian.fugue:fugue
com.atlassian.fugue.*
org.dom4j:dom4j
org.dom4j.*
Removal of binary installers
Starting from Jira 10.0, the
.bin
and.exe
installers will no longer be available. You can still install Jira using the.zip
and.tar.gz
distributions.Because of this change, Java is no longer bundled with Jira. Install Java manually
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:
.bin
and.exe
binary 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 @
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.
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 @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 andjavax.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) and
java.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.
There is a suggested workaround here: java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A error in some Arqullian testsbug
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:
View full product version
Link to comment
https://beta.jimiwikman.se/forums/topic/12320-jira-service-management-100/Share on other sites