Java 11 and Jira platform upgrade

Still need help?

The Atlassian Community is here for you.

Ask the community

Refer to the following guide to learn more about the changes related to Java 11 upgrade and the Jira platform upgrade. 

The complete list of maven dependencies for Jira 8.0.0 can be found in the jira-project pom.

Java 11 and Platform changes

Change

Details

Migrated to the newest Atlassian Fugue

  • Jira API was updated to use the newest io.atlassian.fugue library

  • the old com.atlassian.fugue library is now deprecated and should not be used

Migrated to the newest Atlassian Concurrent

  • Jira API was updated to use the newest io.atlassian.util.concurrent library

  • the old com.atlassian.util.concurrent library is now deprecated and should not be used

Migrated to Spring 5

  • Jira is now running on Spring framework 5.0.10

Migrated to Guava 26

  • Jira is now running on Guava 26.0-jre

Updated all the platform components for Java 11 and Atlassian Platform 5.0.0 compatibility

  • amps → 8.0.0-m6

  • atlassian-cache → 4.0.0

  • atlassian-authentication-plugin → 3.0.0-a22dd6d

  • atlassian-oauth → 4.0.2

  • altassian-embedded-crowd → 2.10.5-j11

  • upm-server → 4.0.0-rc1

Updated third-party libraries for Java 11 and Atlassian Platform 5.0.0 compatibility


  • Guava → 26.0-jre

  • Spring framework → 5.0.10.RELEASE

  • servlet-api → 3.0.1

  • jaxb → 2.3.0

  • commons-lang3 → 3.8

  • commons-io → 2.6

  • commons-fileupload → 1.3.3

  • javax.activation → 1.2.0

  • validation-api → 2.0.1.Final

  • httpclient → 4.5.5

  • httpcomponents → 4.4.9

  • slf4j → 1.7.25

  • log4j → 1.2.17-atlassian-2

JVM parameter for locale compatibility

Turned on locale compatibility mode with -Djava.locale.providers=COMPAT 

Details

Since Java 9 there's been a switch from using JRE locale data to Unicode Consortium's Common Locale Data Repository (CLDR) locale data by default (docs). That, amongst others, makes for example short month names in  en_AU  locale being formatted with trailing dot, so. e.g.:

  • Java 8:  19/Jul/18

  • Java >=9:  19/Jul./18

Other formatting aspects are impacted too, such as "AM" -> "am", and maybe others. The changes affected dates parsing also.

This made Jira behave differently and also made some tests red.

Fortunately one can force Java 8 compatible locale data source with  -Djava.locale.providers=COMPAT  switch

Java version check and GC params

Modified startup scripts to:

  • allow JDK 8 or JDK 11 to be used
  • use GC parameters compatible with Java 11 when running on JDK 11
Removed items (libraries, classes, code)
  • atlassian-extension library

  • com.atlassian.jira.plugin.ExtensionAccessorPicoAdapter

  • com.atlassian.jira.util.system.check.PluginVersionCheck


API breaking changes

Affected classCode/items being changedChanges and new code/items
com.atlassian.jira.bc.dataimport.DataImportEventMethod: getXmlExportTimeReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.dataimport.ImportCompletedEventConstructorsAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getXmlExportTimeReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.dataimport.ImportStartedEventConstructorsAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getXmlExportTimeReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.issue.comment.CommentService$CommentCreateValidationResultConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getCommentInputParametersReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.issue.comment.CommentService$CommentUpdateValidationResult


ConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option

Methods: getCommentPropertiesgetComment

Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.issue.visibility.InvalidVisibilityMethod: getParamReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.project.version.VersionService$ValidationResultMethod: getVersionToMergeToReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.project.ProjectServiceMethod: updateProjectTypeReturns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.license.JiraLicenseManagerMethod: getLicenseReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.license.LicenseChangedEventConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Fields: previousLicenseDetailsnewLicenseDetailsType io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Methods: getPreviousLicenseDetailsgetNewLicenseDetailsReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyHelperMethods: createSetPropertyEventFunctioncreateDeletePropertyEventFunctionDeprecated methods removed
Method: getEntityByIdFunctionReturns java.util.function.Function instead of com.google.common.base.Function
com.atlassian.jira.entity.property.EntityPropertyService$DeletePropertyValidationResult

Constructor

Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyService$PropertyServiceResultConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getEntityPropertyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyService$SetPropertyValidationResultConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getEntityPropertyInputReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyService$PropertyResultConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.util.FunctionMethod: getRenamed → apply
com.atlassian.jira.util.ResolverMethod: getRenamed → apply
com.atlassian.jira.util.OrderByRequestParserMethod: parseReturns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.util.collect.EnclosedIterable$ListResolverMethod: getRenamed → apply
com.atlassian.jira.util.lang.JiraStringUtilsMethod: toLongReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.properties.PropertiesManagerMethod: getPropertySetReferenceReturns java.util.function.Supplier instead of com.atlassian.util.concurrent.Supplier
com.atlassian.jira.config.properties.BackingPropertySetManagerMethod: getPropertySetSupplierReturns java.util.function.Supplier instead of com.atlassian.util.concurrent.Supplier
com.atlassian.jira.config.IssueTypeServiceMethod: getIssueTypeReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeDeleteInputConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getAlternativeIssueTypeIdReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeUpdateInputMethods: getAvatarIdgetNamegetDescriptionReturn io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$UpdateValidationResultMethods: getIssueTypegetIssueTypeInputReturn io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$DeleteValidationResultConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getDeleteIssueTypeInputReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeCreateInputMethod: getDescriptionReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$CreateValidationResultMethod: getIssueTypeInputReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.FeatureManagerMethod: getFeatureFlagReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.ConstantsManagerMethod: validateNameAccepts and returns io.atlassian.fugue.Optioninstead of com.atlassian.fugue.Option
com.atlassian.jira.project.UpdateProjectParameters

Methods: getDescriptiongetKeygetProjectTypeKeygetAvatarId

getProjectCategoryIdgetUrlgetNamegetLeadUsernamegetLeadUserKeygetAssigneeType

Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.project.version.VersionManagerMethods: deleteVersionswapVersionForRelatedIssuesAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.project.type.ProjectTypeManager

Methods: getByKeygetAccessibleProjectType

getApplicationWithTypegetAccessibleProjectType

Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.application.api.ApplicationKeyMethod: getApplicationReturn io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.comment.CommentFieldRendererModuleDescriptorMethods: getIssuePageViewHtmlgetFieldEditHtmlgetIssuePageEditHtmlgetFieldViewHtmlReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.customfield.CustomFieldTypeModuleDescriptorsMethod: getCustomFieldTypeReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.customfield.CustomFieldSearcherModuleDescriptorsMethod: getCustomFieldSearcherReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.report.ReportUrlProviderMethod: getUrlReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.security.PermissionManagerMethod: getProjectPermissionReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.help.HelpUrlsParserBuilderFactory$HelpUrlsParserBuilderMethod: applicationHelpSpaceAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.portal.PortletConfigurationMethods: getOpenSocialSpecUrigetCompleteModuleKeyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.portal.PortletConfigurationManagerMethod: addDashBoardItemAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.PermissionHolderMethod: getParameterReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.PermissionSchemeInputMethod: getDescriptionReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.JiraPermissionHolderTypeMethod: fromKeyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.event.project.VersionDeleteEventMethods: getFixVersionSwappedTogetMergedTogetAffectsVersionSwappedToReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.application.ApplicationRoleManagerMethod: getRoleReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.issue.attachment.TemporaryAttachmentMethod: getEntityTokenAccepts io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.attachment.TemporaryWebAttachmentManagerMethod: getTemporaryWebAttachmentReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: createTemporaryWebAttachmentAccepts and returns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.AttachmentValidatorMethod: canCreateTemporaryAttachmentsAccepts io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.AttachmentErrorConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getExceptionReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.issue.AttachmentsBulkOperationResultConstructorAccepts io.atlassian.fugue.Pair instead of com.atlassian.fugue.Pair
com.atlassian.jira.issue.AttachmentManagerMethods: convertTemporaryAttachmenttryCreateAttachmentcopyAttachmentReturns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanMethods: builderpropertySelfDeprecated overloads accepting com.atlassian.fugue.Function2 removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBean$BuilderConstructorDeprecated overload accepting com.atlassian.fugue.Function2 removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctionsMethod: dashboardItemPropertySelfFunctionDeprecated method removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$IssuePropertySelfFunctionClassDeprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$ProjectPropertySelfFunctionClassDeprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$CommentPropertySelfFunctionClassDeprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$IssueTypePropertySelfFunctionClassDeprecated class removed
com.atlassian.jira.issue.search.util.TextTermEscaperMethod: getRenamed → apply
com.atlassian.query.clause.TerminalClauseMethod: getPropertyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.query.clause.TerminalClauseImplConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getPropertyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.query.order.SearchSortConstructorAccepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getPropertyReturns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option


Change log

You can also refer to the resources below for a description of changes in the core components:

Last modified on Aug 13, 2019

Was this helpful?

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