Jira Service Management 10.0.x upgrade notes

Jira Service Management Release Notes

On this page

Still need help?

The Atlassian Community is here for you.

Ask the community

Below are some important notes on upgrading to Jira Service Management 10.0.x. For details on the new features and improvements in this release, see:

Platform releases allow us to incorporate multiple significant changes (often called “breaking changes”) that aren't compatible with previous versions. These changes establish a strong foundation for more extensive development in future releases.

To increase security and performance, we’ve made changes in our core architecture that require apps to bundle their libraries. We’re collaborating with our Marketplace partners on these changes, however, some apps may not be immediately compatible with the new platform upon release and cause product experience breaks. We recommend that you review your apps before upgrading to avoid service disruptions for your organization.

To check app compatibility, visit Checking app compatibility with application updates or the Atlassian Marketplace to see if your app hosting is compatible with your product version.


Upgrade notes

Removal of REST API endpoints

For: ADMINS

We’ve removed the following REST API endpoints in the Jira Service Management 10.0.

ChangeInstructions

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-countUse PUT /servicedeskapi/admin/queues/{projectKey}/include-count
Removed PUT /servicedeskapi/queues/cache-countUse PUT /servicedeskapi/admin/queues/cache-count
Removed PUT /servicedeskapi/queues/{projectKey}/cache-countUse 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.
  • Changes to the resolution of properties of isser/getter.
  • 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 Jackson ObjectMapper.

    java.lang.RuntimeException: Unable to load FastStringService
    	at org.apache.groovy.json.internal.FastStringUtils.getService(FastStringUtils.java:56) ~[?:?]
    	at org.apache.groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:66) ~[?:?]
    	at org.apache.groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:114) ~[?:?]
    	at groovy.json.JsonSlurper.parseText(JsonSlurper.java:205) ~[?:?]
  • The following table lists the changes to the names of classes, packages, and modules.

  • For the full list of breaking changes, check out:


Class/package/module nameGroovy 2Groovy 4
groovy-xmlgroovy.utilgroovy.xml
groovygroovy.xml.QNamegroovy.namespace
groovy-antgroovy.utilgroovy.ant
groovy-consolegroovy.inspectgroovy.console

groovy.inpsect.swingui

groovy.ui

groovy.console.ui
groovy.ui.ConsoleAppletDeprecated
groovy-groovysh

org.codehaus.groovy.tools.shell

org.apache.groovy.groovysh
groovy-jmx

groovy.util.GroovyMBean

groovy.jmx
groovy-nio

org.codehaus.groovy.runtime.NioGroovyMethods

org.apache.groovy.nio.extensions.NioExtensions

org.codehaus.groovy.runtime.WritablePath

org.apache.groovy.nio.runtime
groovy-swing

org.codehaus.groovy.binding

org.apache.groovy.swing.binding

groovy.model

groovy.swing.model

groovy.inspect.swingui

org.apache.groovy.swing.table
groovy-test

org.codehaus.groovy.runtime.ScriptTestAdapter

org.apache.groovy.test
groovy.transform.NotYetImplementedgroovy.test.NotYetImplemented
groovy.utilgroovy.test
groovy.langgroovy.test
GroovyClassLoaderTypes for sourceCache and classCache have changed from Map to stronger types

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:

  1. Find the row counts by running the following commands in your database:

    SELECT COUNT(*) FROM jiraissue;
    SELECT COUNT(*) FROM jiraaction;
    SELECT COUNT(*) FROM changegroup;
  2. Use the following benchmark data provided for Amazon RDS db.m6g.8xlarge and estimate your downtime:
    1. jiraissue table: approximately 26.527 seconds per million rows
    2. jiraaction table: approximately 7.592 seconds per million rows
    3. 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 nameDescription

    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 nameDescription

    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.

See the full list of changes

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 of UserSearchParams 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 appropriate Stream#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 using ImmutableMap 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 or com.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 new HelpUrlsParse 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 to visibility.

com.atlassian.jira.bc.issue.comment.CommentService

#isValidCommentData(com.atlassian.jira.user.ApplicationUser, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String, com.atlassian.jira.util.ErrorCollection) 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 returns io.atlassian.fugue.Option<String> instance with appropriate group level value:
#getVisibility().accept(VisibilityVisitors.returningGroupLevelVisitor())

com.atlassian.jira.bc.issue.util.VisibilityValidator

  • #isProjectRoleVisiblityEnabled() renamed to #isProjectRoleVisibilityEnabled()
  • isGroupVisiblityEnabled() renamed to #isGroupVisibilityEnabled()

removed.

Use methods with the visiblity typo corrected to visibility.

com.atlassian.jira.bc.issue.util.VisibilityValidator

#isValidVisibilityData(com.atlassian.jira.bc.JiraServiceContext, java.lang.String, com.atlassian.jira.issue.Issue, java.lang.String, java.lang.String) 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) or recalculateIssueTypeSequencesAndStore(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() instead

com.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 and com.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 by jira-api

Whole class removed.

Use com.atlassian.jira.issue.table.IssueTable provided by jira-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 by jira-testkit-client

The class has been deprecated.

Use com.atlassian.jira.testkit.client.restclient.ParsedResponse instead.

com.atlassian.jira.testkit.client.RestApiClient

#toResponse() accepts RestCall functional interface.

Use new RestCall interface or lambda in place of Method 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 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.

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 returns Map<String, String> instead of Map<String, JsonNode>

Serialize the value before passing to the method and deserialize after reading it.

com.atlassian.jira.issue.UpdateIssueRequest

#getProperties() now returns Map<String, String> instead of Map<String, JsonNode>

#UpdateIssueRequestBuilder#issueProperties now accepts Map<String, String>

Serialize the value before passing to the method and deserialize after reading it.

com.atlassian.jira.issue.util.IssueUpdateBean

#getProperties now returns Map<String, String>

#addProperties now accepts Map<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 returns Map<String, String>

Serialize the value before passing to the method and deserialize after reading it.

com.atlassian.jira.bc.issue.IssueService.UpdateValidationResult

constructor now accepts Map<String, String>

#getProperties now returns Map<String, String>

Serialize the value before passing to the method and deserialize after reading it.

com.atlassian.configurable.ObjectConfigurationFactory

#loadObjectConfigurationFromElement now accepts com.atlassian.plugin.module.Element instead of org.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 of com.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 in AttachmentConfigManager.

com.atlassian.jira.testkit.client.AttachmentsControl

com.atlassian.jira.testkit.plugin.AttachmentsBackdoor)

Whole classes removed.

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.

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.

See the full list of changes

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 installers
  • H2 database engine
  • Java 8
  • Java 11

We’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.

See the full list

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 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.

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:

  • 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.
Last modified on Nov 6, 2024

Was this helpful?

Yes
No
Provide feedback about this article
Powered by Confluence and Scroll Viewport.