Open Liberty 23.0.0.3里对Jakarta EE 10, MicroProfile 6, 和Java SE 20的支持
翻译: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 的包.
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 Core Profile 10
规范 | 变更 | Liberty特性文档 |
---|---|---|
新规 |
||
重大更新 |
||
次要更新 |
||
次要更新 |
||
次要更新 |
||
未变更 |
Jakarta EE Web Profile 10
规范 | 变更 | Liberty特性文档 |
---|---|---|
新规 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
重大更新 |
||
次要更新 |
||
次要更新 |
||
次要更新 |
||
未变更 |
||
未变更 |
不适用 |
|
未变更 |
||
未变更 |
||
未变更 |
不适用 (见 Javadoc) |
Jakarta EE Platform 10
规范 | 变更 | Liberty特性文档 |
---|---|---|
重大更新 |
||
次要更新 |
||
次要更新 |
不适用 (见 Javadoc) |
|
次要更新 |
||
次要更新 |
||
次要更新 |
||
次要更新 |
||
未变更 |
||
XML Binding 4.0 (optional) |
重大更新 |
|
XML Web Services 4.0 (optional) |
重大更新 |
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 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:
-
获取Open Liberty 23.0.0.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事件对象恢复无误。
-
在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范围已被正确接受
-
在使用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的使用,这个问题得到了缓解,死锁不再发生。