back to all blogs查看所有博客帖子

Open Liberty 23.0.0.3里对Jakarta EE 10, MicroProfile 6, 和Java SE 20的支持

image of author
Michal Broz 2023年4月 4日
以其他语言提供的职位: English , 日本語 ,

翻译:Haiyan Zhang

我们很高兴地宣布 Open Liberty 23.0.0.3发布了,这是自5年前首次亮相以来最大的运行时版本之一! 此版本包括 Jakarta EE 10 Platform、Web Profile,并且首次包含Core Profile。还在构成profiles的大部分功能中添加了许多新的增强功能。

包含Jakarta EE Core Profile 10的MicroProfile 6也将在23.0.0.3版本中正式亮相。它包括新的MicroProfile Telemetry 1.0特性,以及对Metrics、OpenAPI和JWT Authentication规范的更新。

在23.0.0.3发行版中还引入了对Java SE 20(撰写本文时的最新版本)的支持,并提供了各种新特性和更改。许多值得注意的错误修复也包含在这个Open Liberty版本中。

Open Liberty 23.0.0.3里包含:

使用Open Liberty 23.0.0.3运行应用程序

如果您使用 Maven, 可以参考:

<dependency>
    <groupId>io.openliberty</groupId>
    <artifactId>openliberty-runtime</artifactId>
    <version>23.0.0.3</version>
    <type>zip</type>
</dependency>

或者是 Gradle:

dependencies {
    libertyRuntime group: 'io.openliberty', name: 'openliberty-runtime', version: '[23.0.0.3,)'
}

或者您使用的是 container images:

FROM icr.io/appcafe/open-liberty

或者可以查看我们的 下载页面, 我们已经添加了Jakarta EE 10 和MicroProfile 6 的包.

Stack Overflow中提问

Jakarta EE 10 Core Profile, Web Profile还有Platform

Jakarta EE 10 Core Profile, Web Profile和Platform现在正式支持Open Liberty! 我们首先要感谢所有在我们的各种测试版中提供反馈的人。

Jakarta EE 10标志着一个重要的里程碑。这是自2017年Java EE 8以来第一个提供规范更新的Jakarta版本,因此也是自Eclipse基金会接管该规范以来第一个提供规范更新的版本。在对现有规范的众多更新中,它还引入了Core Profile。Core Profile的目标是轻量级运行时,比如Open Liberty,它针对运行云原生Java微服务进行了优化。

Jakarta Platform以及Core和Web Profile由以下规范组成:

Jakarta EE Platform 10

规范 变更 Liberty特性文档

Jakarta EE Web Profile 10

重大更新

见上表

Authorization 2.1

次要更新

appAuthorization-2.1

Activation 2.1

次要更新

不适用 (见 Javadoc)

Batch 2.1

次要更新

batch-2.1

Connectors 2.1

次要更新

connectors-2.1

Mail 2.1

次要更新

mail-2.1

Messaging 3.1

次要更新

messaging-3.1

Enterprise Beans 4.0

未变更

enterpriseBeans-4.0

XML Binding 4.0 (optional)

重大更新

xmlBinding-4.0

XML Web Services 4.0 (optional)

重大更新

xmlWS-4.0

Liberty为运行包含在Jakarta EE 10 Web Profile (webProfile-10.0)和Jakarta EE 10 Platform (jakartaee-10.0)中的所有组件规范提供了便利的特性。这些便利的特性使您能够使用各自规范中的所有API快速开发应用程序。对于应用程序客户端中的Jakarta EE 10特性,请使用Liberty jakartaeeClient-10.0特性。

要使用Jakarta EE Platform 10特性,请在server.xml文件里添加jakartaee-10.0 feature

  <featureManager>
    <feature>jakartaee-10.0</feature>
  </featureManager>

或者,要启用Jakarta EE Web Profile 10功能,请在server.xml文件中添加webProfile-10.0 feature:

  <featureManager>
    <feature>webProfile-10.0</feature>
  </featureManager>

虽然没有针对Core Profile的便利功能,但您可以通过server.xml文件里添加以下功能来启用等效功能:

  <featureManager>
    <feature>jsonb-3.0</feature>
    <feature>jsonp-2.1</feature>
    <feature>cdi-4.0</feature>
    <feature>restfulWS-3.1</feature>
  </featureManager>

要在应用程序客户端容器上运行Jakarta EE 10特性,请在应用程序的client .xml文件中添加以下条目:

  <featureManager>
    <feature>jakartaeeClient-10.0</feature>
  </featureManager>

更多的信息请参考

MicroProfile 6.0

MicroProfile在业界如何优化Java微服务上持续创新。MicroProfile 6.0版本允许应用程序使用MicroProfile APIs和 Jakarta EE Core Profile 10以及其他各种新功能和改进。MicroProfile 6.0包含以下规范:

规范 变更 Liberty特性文档

MicroProfile Telemetry 1.0

新规

mpTelemetry-1.0

MicroProfile Metrics 5.0

重大更新

mpMetrics-5.0

MicroProfile OpenAPI 3.1

次要更新

mpOpenAPI-3.1

MicroProfile JWT Authentication 2.1

次要更新

mpJwt-2.1

MicroProfile Config 3.0

未变更

mpConfig-3.0

MicroProfile Health 4.0

未变更

mpHealth-4.0

MicroProfile Rest Client 3.0

未变更

mpRestClient-3.0

MicroProfile Fault Tolerance 4.0

未变更

mpFaultTolerance-4.0

Jakarta EE Core Profile 10

新规

见 Core Profile table

要使用所有MicroProfile 6特性,请在server.xml文件中添加microProfile-6.0 feature:

  <featureManager>
    <feature>microProfile-6.0</feature>
  </featureManager>

可以通过MicroProfile 6.0 specification, release, Javadoc, 还有Differences between MicroProfile 6.0 and 5.0查看更多信息

对Java SE 20的支持

Java 20包含下面的特性和变更:

如何使用Java 20:

  1. 下载 Java 20.

  2. 获取Open Liberty 23.0.0.3 版本.

  3. 编辑Liberty server.env 文件,将 JAVA_HOME 指向Java 20 installation安装路径.

有关Java 20的更多信息,可以参考Java 20相关发布说明,API Javadoc 页面, download page and Java 20 迁移手册.

在Open Liberty中试用Java 20预览特性,请确保使用 --enable-preview进行编译,并在jvm.options文件中添加相同的参数。

此版本中值得注意的错误修复

我们花了一些时间来修复bug。下面的部分描述了在这个版本中解决的一些问题。如果您感兴趣,这里是 23.0.0.3中修复的完整错误列表

  • 启用了撤销的AcmeCA特性在某些操作系统和JDK组合上可能无法初始化

    当在MacOS上运行带有IBM JDK8和自动证书管理环境(ACME)支持2.0功能并启用证书撤销检查的混合JDK时,SSL/TLS端点可能无法完成初始化,并且无法用于通信。

    FFDC里记录如下NullPointerException,表示初始化流程失败:

    Exception = java.lang.NullPointerException
    Source = com.ibm.ws.security.acme.internal.AcmeProviderImpl
    probeid = 921
    Stack Dump = java.lang.NullPointerException
    at sun.security.provider.certpath.CertPathHelper.setDateAndTime(CertPathHelper.java:71)
    at sun.security.provider.certpath.RevocationChecker.checkCRLs(RevocationChecker.java:525)
    at sun.security.provider.certpath.RevocationChecker.checkCRLs(RevocationChecker.java:464)
    at sun.security.provider.certpath.RevocationChecker.check(RevocationChecker.java:393)
    at sun.security.provider.certpath.RevocationChecker.check(RevocationChecker.java:336)
    at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:125)
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:225)
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:145)
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:84)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:304)
    at com.ibm.ws.security.acme.internal.CertificateRevocationChecker.isRevoked(CertificateRevocationChecker.java:371)
    ....

    此问题已解决,端点已成功初始化,并可用于服务通信。

被注入jakarta.enterprise.event.Event(或类似javax)的passivated (即可序列化)bean将无法正常恢复。当启用会话持久性并且从数据库序列化和反序列化会话数据时,可能会遇到这种情况。这会导致以下FFDC事件发生:

+

Stack Dump = java.lang.ClassCastException: cannot assign instance of org.jboss.weld.event.EventImpl$SerializationProxy to field org.apache.myfaces.flow.cdi.FlowScopeContextualStorageHolder.flowDestroyedEvent of type jakarta.enterprise.event.Event in instance of org.apache.myfaces.flow.cdi.FlowScopeContextualStorageHolder
        at java.base/java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2076)
        at java.base/java.io.ObjectStreamClass$FieldReflector.checkObjectFieldValueTypes(ObjectStreamClass.java:2039)
        at java.base/java.io.ObjectStreamClass.checkObjFieldValueTypes(ObjectStreamClass.java:1293)
        at java.base/java.io.ObjectInputStream.defaultCheckFieldValues(ObjectInputStream.java:2512)

+ 此问题已解决,CDI事件对象恢复无误。

  • 需要更新JDBC DB2 queryDataSize的值

    在DB2 11.5.7+中,将DB2数据源的queryDataSize设置为有效值时,会出现以下错误:

    [ERROR   ] CWWKG0075E: The value 10452991 is not valid for attribute `queryDataSize` of configuration element dataSource. The validation message was: Value "10452991" is out of range..

    此问题已得到解决,新的queryDataSize范围已被正确接受

  • Liberty服务器随机挂起

    在使用JAX-RS时一个 OpenJ9里的bug可能会导致Liberty服务器因死锁而挂起。例如:、、

    2LKMONINUSE      sys_mon_t:0x00007FCE3C16F258 infl_mon_t: 0x00007FCE3C16F2D8:
    3LKMONOBJECT       org/apache/cxf/jaxrs/interceptor/CachedTime@0x00000000FBF1D0C8: Flat locked by "Default Executor-thread-8" (J9VMThread:0x0000000001B4BF00), entry count 1
    3LKWAITERQ            Waiting to enter:
    3LKWAITER                "Default Executor-thread-1" (J9VMThread:0x00000000006EB200)
    3LKWAITER                "Default Executor-thread-3" (J9VMThread:0x0000000000718D00)
    3LKWAITER                "Default Executor-thread-17" (J9VMThread:0x0000000002644B00)
    3LKWAITER                "Default Executor-thread-19" (J9VMThread:0x0000000000346F00)
    3LKWAITER                "Default Executor-thread-20" (J9VMThread:0x0000000000618300)
    3LKWAITER                "Default Executor-thread-29" (J9VMThread:0x0000000002645700)
    3LKWAITER                "Default Executor-thread-30" (J9VMThread:0x0000000002643F00)
    3LKWAITER                "Default Executor-thread-39" (J9VMThread:0x00000000022FF900)
    3LKWAITER                "Default Executor-thread-40" (J9VMThread:0x00000000022DAA00)
    3LKWAITER                "Default Executor-thread-49" (J9VMThread:0x000000000216DE00)
    3LKWAITER                "Default Executor-thread-50" (J9VMThread:0x00000000022FED00)
    3LKWAITER                "Default Executor-thread-59" (J9VMThread:0x0000000001B74900)
    3LKWAITER                "Default Executor-thread-60" (J9VMThread:0x0000000002178F00)
    3LKWAITER                "Default Executor-thread-62" (J9VMThread:0x0000000001B72300)
    
    "Default Executor-thread-8" J9VMThread:0x0000000001B4BF00, omrthread_t:0x00007FCE18012DF0, java/lang/Thread:0x00000000FBF99E78, state:B, prio=5
           (java/lang/Thread getId:0x4C, isDaemon:true)
           com/ibm/ws/classloading/internal/ThreadContextClassLoader(0x0000000086272FF8)
           (native thread ID:0x1A4, native priority:0x5, native policy:UNKNOWN, vmstate:B, vm thread flags:0x00000281)
           (native stack address range from:0x00007FCEA0FF6000, to:0x00007FCEA1036000, size:0x40000)
          CPU usage total: 3.272702139 secs, current category="Application"
    Blocked on: java/lang/StringBuffer@0x00000000FBF99F10 Owned by: "Default Executor-thread-1" (J9VMThread:0x00000000006EB200, java/lang/Thread:0x00000000804DA638)
          Heap bytes allocated since last GC cycle=0 (0x0)
          Java callstack:
              at java/lang/StringBuffer.setLength(Bytecode PC:0(Compiled Code))
                 (entered lock: java/lang/StringBuffer@0x00000000FBF99F10, entry count: 1)
              at org/apache/cxf/jaxrs/interceptor/CachedTime.updateTime(CachedTime.java:86)
              at org/apache/cxf/jaxrs/interceptor/CachedTime.getTimeAsString(CachedTime.java:134)

    在Liberty中,通过从CXF的CachedTime类中删除SimpleDateFormat的使用,这个问题得到了缓解,死锁不再发生。

现在就来使用Open Liberty 23.0.0.3