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 class Code/items being changed Changes and new code/items
com.atlassian.jira.bc.dataimport.DataImportEvent Method: getXmlExportTime Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.dataimport.ImportCompletedEvent Constructors Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getXmlExportTime Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.dataimport.ImportStartedEvent Constructors Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getXmlExportTime Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.issue.comment.CommentService$CommentCreateValidationResult Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getCommentInputParameters Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.issue.comment.CommentService$CommentUpdateValidationResult


Constructor Accepts 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.InvalidVisibility Method: getParam Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.project.version.VersionService$ValidationResult Method: getVersionToMergeTo Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.bc.project.ProjectService Method: updateProjectType Returns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.license.JiraLicenseManager Method: getLicense Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.license.LicenseChangedEvent Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Fields: previousLicenseDetailsnewLicenseDetails Type io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Methods: getPreviousLicenseDetailsgetNewLicenseDetails Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyHelper Methods: createSetPropertyEventFunctioncreateDeletePropertyEventFunction Deprecated methods removed
Method: getEntityByIdFunction Returns 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$PropertyServiceResult Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getEntityProperty Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyService$SetPropertyValidationResult Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getEntityPropertyInput Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.entity.property.EntityPropertyService$PropertyResult Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.util.Function Method: get Renamed → apply
com.atlassian.jira.util.Resolver Method: get Renamed → apply
com.atlassian.jira.util.OrderByRequestParser Method: parse Returns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.util.collect.EnclosedIterable$ListResolver Method: get Renamed → apply
com.atlassian.jira.util.lang.JiraStringUtils Method: toLong Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.properties.PropertiesManager Method: getPropertySetReference Returns java.util.function.Supplier instead of com.atlassian.util.concurrent.Supplier
com.atlassian.jira.config.properties.BackingPropertySetManager Method: getPropertySetSupplier Returns java.util.function.Supplier instead of com.atlassian.util.concurrent.Supplier
com.atlassian.jira.config.IssueTypeService Method: getIssueType Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeDeleteInput Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getAlternativeIssueTypeId Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeUpdateInput Methods: getAvatarIdgetNamegetDescription Return io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$UpdateValidationResult Methods: getIssueTypegetIssueTypeInput Return io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$DeleteValidationResult Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getDeleteIssueTypeInput Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$IssueTypeCreateInput Method: getDescription Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.IssueTypeService$CreateValidationResult Method: getIssueTypeInput Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.FeatureManager Method: getFeatureFlag Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.config.ConstantsManager Method: validateName Accepts 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.VersionManager Methods: deleteVersionswapVersionForRelatedIssues Accepts 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.ApplicationKey Method: getApplication Return io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.comment.CommentFieldRendererModuleDescriptor Methods: getIssuePageViewHtmlgetFieldEditHtmlgetIssuePageEditHtmlgetFieldViewHtml Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.customfield.CustomFieldTypeModuleDescriptors Method: getCustomFieldType Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.customfield.CustomFieldSearcherModuleDescriptors Method: getCustomFieldSearcher Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.plugin.report.ReportUrlProvider Method: getUrl Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.security.PermissionManager Method: getProjectPermission Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.help.HelpUrlsParserBuilderFactory$HelpUrlsParserBuilder Method: applicationHelpSpace Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.portal.PortletConfiguration Methods: getOpenSocialSpecUrigetCompleteModuleKey Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.portal.PortletConfigurationManager Method: addDashBoardItem Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.PermissionHolder Method: getParameter Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.PermissionSchemeInput Method: getDescription Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.permission.JiraPermissionHolderType Method: fromKey Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.event.project.VersionDeleteEvent Methods: getFixVersionSwappedTogetMergedTogetAffectsVersionSwappedTo Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.application.ApplicationRoleManager Method: getRole Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.issue.attachment.TemporaryAttachment Method: getEntityToken Accepts io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.attachment.TemporaryWebAttachmentManager Method: getTemporaryWebAttachment Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: createTemporaryWebAttachment Accepts and returns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.AttachmentValidator Method: canCreateTemporaryAttachments Accepts io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.AttachmentError Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getException Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.jira.issue.AttachmentsBulkOperationResult Constructor Accepts io.atlassian.fugue.Pair instead of com.atlassian.fugue.Pair
com.atlassian.jira.issue.AttachmentManager Methods: convertTemporaryAttachmenttryCreateAttachmentcopyAttachment Returns io.atlassian.fugue.Either instead of com.atlassian.fugue.Either
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBean Methods: builderpropertySelf Deprecated overloads accepting com.atlassian.fugue.Function2 removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBean$Builder Constructor Deprecated overload accepting com.atlassian.fugue.Function2 removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions Method: dashboardItemPropertySelfFunction Deprecated method removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$IssuePropertySelfFunction Class Deprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$ProjectPropertySelfFunction Class Deprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$CommentPropertySelfFunction Class Deprecated class removed
com.atlassian.jira.issue.fields.rest.json.beans.EntityPropertyBeanSelfFunctions$IssueTypePropertySelfFunction Class Deprecated class removed
com.atlassian.jira.issue.search.util.TextTermEscaper Method: get Renamed → apply
com.atlassian.query.clause.TerminalClause Method: getProperty Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.query.clause.TerminalClauseImpl Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getProperty Returns io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
com.atlassian.query.order.SearchSort Constructor Accepts io.atlassian.fugue.Option instead of com.atlassian.fugue.Option
Method: getProperty Returns 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.