开发和运行环境服务升级
1. 安装JDK17
根据本地开发系统环境选择合适的安装包进行下载并使用
注意事项:
- 安装jdk17
- JAVA_HOME/PATH 环境变量配置
2. RocketMQ 升级
推荐升级至 4.8.x 版本
注:若 RocketMQ 版本低于 4.8.x 版本,需进行升级,否则无法正常运行在 JDK17 环境中。
| 支持程度 | RocketMQ 版本 | 关键说明 |
|---|---|---|
| 基础运行兼容 | 4.8.0+ | 首次适配 JDK 9+ 核心运行环境,修复模块导出、反射限制等基础问题 |
| 完整特性兼容 | 4.9.0+ | 解决 JDK 9+ 下的网络、线程、日志等细节兼容问题,生产环境可落地 |
| 官方明确标注支持 | 5.0.0+(5.x 全系列) | 官网文档明确声明支持 JDK 8/11/17(9/10 属于过渡版本,间接兼容) |
对于无法升级 RocketMQ 版本的环境,可通过修改 runserver.sh 和 runbroker.sh 运行脚本进行适配。在使用 cmd 脚本的运行环境中,可通过修改 runserver.cmd 和 runbroker.cmd 运行脚本进行适配。
下面提供了基于 4.5.2 版本修改后的 runserver.sh 和 runbroker.sh 脚本进行参考。
修改运行脚本仅适用于无法升级中间件版本的特殊环境,下面提供的修改后的脚本,只能保证收发消息功能正常,无法保证其他功能的正常使用。
核心变更内容:
JAVA_OPT配置使用--add-opens参数以支持非模块化内置包在运行代码中的使用。- 移除
JDK17不再支持的其他JVM参数。
runserver.sh
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
# The RAMDisk initializing size in MB on Darwin OS for gc-log
DIR_SIZE_IN_MB=600
choose_gc_log_directory()
{
case "`uname`" in
Darwin)
if [ ! -d "/Volumes/RAMDisk" ]; then
# create ram disk on Darwin systems as gc-log directory
DEV=`hdiutil attach -nomount ram://$((2 * 1024 * DIR_SIZE_IN_MB))` > /dev/null
diskutil eraseVolume HFS+ RAMDisk ${DEV} > /dev/null
echo "Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS."
fi
GC_LOG_DIR="/Volumes/RAMDisk"
;;
*)
# check if /dev/shm exists on other systems
if [ -d "/dev/shm" ]; then
GC_LOG_DIR="/dev/shm"
else
GC_LOG_DIR=${BASE_DIR}
fi
;;
esac
}
choose_gc_log_directory
# JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.annotation=ALL-UNNAMED \
--add-opens=java.base/java.lang.constant=ALL-UNNAMED \
--add-opens=java.base/java.lang.invoke=ALL-UNNAMED \
--add-opens=java.base/java.lang.module=ALL-UNNAMED \
--add-opens=java.base/java.lang.ref=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.lang.runtime=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.math=ALL-UNNAMED \
--add-opens=java.base/java.net=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/java.security=ALL-UNNAMED \
--add-opens=java.base/java.text=ALL-UNNAMED \
--add-opens=java.base/java.time=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xpath.internal.jaxp=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.access=ALL-UNNAMED"
# JAVA_OPT="${JAVA_OPT} -XX:+IgnoreUnrecognizedVMOptions -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -XX:+IgnoreUnrecognizedVMOptions -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
# JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log"
# JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
# JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
# JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
$JAVA ${JAVA_OPT} $@
runbroker.sh
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
# The RAMDisk initializing size in MB on Darwin OS for gc-log
DIR_SIZE_IN_MB=600
choose_gc_log_directory()
{
case "`uname`" in
Darwin)
if [ ! -d "/Volumes/RAMDisk" ]; then
# create ram disk on Darwin systems as gc-log directory
DEV=`hdiutil attach -nomount ram://$((2 * 1024 * DIR_SIZE_IN_MB))` > /dev/null
diskutil eraseVolume HFS+ RAMDisk ${DEV} > /dev/null
echo "Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS."
fi
GC_LOG_DIR="/Volumes/RAMDisk"
;;
*)
# check if /dev/shm exists on other systems
if [ -d "/dev/shm" ]; then
GC_LOG_DIR="/dev/shm"
else
GC_LOG_DIR=${BASE_DIR}
fi
;;
esac
}
choose_gc_log_directory
# JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.annotation=ALL-UNNAMED \
--add-opens=java.base/java.lang.constant=ALL-UNNAMED \
--add-opens=java.base/java.lang.invoke=ALL-UNNAMED \
--add-opens=java.base/java.lang.module=ALL-UNNAMED \
--add-opens=java.base/java.lang.ref=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.lang.runtime=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.math=ALL-UNNAMED \
--add-opens=java.base/java.net=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/java.security=ALL-UNNAMED \
--add-opens=java.base/java.text=ALL-UNNAMED \
--add-opens=java.base/java.time=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xpath.internal.jaxp=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.access=ALL-UNNAMED"
JAVA_OPT="${JAVA_OPT} -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
# JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log"
# JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
# JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
# JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
then
if [ -z "$RMQ_NUMA_NODE" ] ; then
numactl --interleave=all $JAVA ${JAVA_OPT} $@
else
numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@
fi
else
$JAVA ${JAVA_OPT} $@
fi
3. Zookeeper 升级
推荐升级至 3.9.x 版本
注: 若 Zookeeper 版本低于 3.6.x 版本,需进行升级,否则无法正常运行在 JDK17 环境中。
| 支持程度 | ZooKeeper 版本 | 关键说明 |
|---|---|---|
| 基础运行兼容 | 3.6.0+ | 首次修复 JDK 9+ 模块化、反射限制等核心问题,可运行但需手动适配启动参数 |
| 完整特性兼容 | 3.6.3+ | 解决 JDK 9+ 下的日志、SSL、工具类等边缘场景兼容问题,生产环境可落地 |
| 官方明确标注支持 | 3.7.0+ / 3.8.0+ | 官网文档明确声明支持 JDK 8/11(9/10 为过渡版本,间接兼容),移除老旧 JDK 依赖 |
| LTS 版本最优选择 | 3.8.x(稳定版)/ 3.9.x | 长期支持版本,完全适配 JDK 11/17(LTS),无额外兼容成本 |
代码升级
1. pom编译版本升级
将原有声明了 maven.compiler 和 java.version 相关参数进行修改
<!--
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
-->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<java.vendor>Oracle</java.vendor>
2. maven 编译插件升级
注: 按需选择升级,只要保证 install, package, deploy 等常用生命周期正常使用即可
<maven.compiler.version>3.14.0</maven.compiler.version>
<maven.surefire.version>3.5.3</maven.surefire.version>
<maven.source.version>3.3.1</maven.source.version>
<maven.install.version>3.1.4</maven.install.version>
<maven.deploy.version>3.1.4</maven.deploy.version>
<maven.war.version>3.4.0</maven.war.version>
3. 第三方版本升级(无需执行)
注: 此处不包含间接升级的第三方依赖,仅包含 Oinone 主动升级的第三方依赖。
<commons.lang3.version>3.18.0</commons.lang3.version>
<commons.collections4.version>4.5.0</commons.collections4.version>
<commons.beanutils.version>1.11.0</commons.beanutils.version>
<gson.version>2.13.1</gson.version>
<druid.version>1.2.25</druid.version>
<mybatis.version>3.5.19</mybatis.version>
<mybatis.spring.version>3.0.4</mybatis.spring.version>
<mybatis-plus.version>3.5.11</mybatis-plus.version>
<thymeleaf.version>3.1.3.RELEASE</thymeleaf.version>
<aspectj.version>1.9.24</aspectj.version>
<aspectjweaver.version>1.9.24</aspectjweaver.version>
<caffeine.version>3.2.2</caffeine.version>
<groovy.version>4.0.28</groovy.version>
<kryo.version>5.6.2</kryo.version>
<dubbo.version>3.2.18</dubbo.version>
<dubbo.extensions.version>3.3.1</dubbo.extensions.version>
<spring.boot.version>3.3.13</spring.boot.version>
<spring.cloud.version>2023.0.6</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.3.3</spring.cloud.alibaba.version>
<spring.cloud.nacos.version>2023.0.3.3</spring.cloud.nacos.version>
<spring.version>6.1.21</spring.version>
<atomikos.version>6.0.0</atomikos.version>
<jedis.version>5.0.2</jedis.version>
<httpclient.version>4.5.13</httpclient.version>
<minio.version>6.0.13</minio.version>
<okhttp.version>3.14.9</okhttp.version>
<org.junit5.platform.version>1.13.4</org.junit5.platform.version>
<org.junit5.jupiter.version>5.13.4</org.junit5.jupiter.version>
<org.junit5.vintage.version>5.13.4</org.junit5.vintage.version>
<junit4.version>4.13.2</junit4.version>
<jacoco.version>0.8.13</jacoco.version>
4. Oinone Bom 升级
注:7.x 版本继续保持原有依赖方式不变,仅需升级版本号即可完成 Oinone 平台升级。最新版本请参考更新日志。
<oinone.version>7.0.0</oinone.version>
<dependency>
<groupId>pro.shushi</groupId>
<artifactId>oinone-bom</artifactId>
<version>${oinone.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
5. 类引入路径变更
JDK 17 作为长期支持版,已完全移除内置的 Java EE 相关模块(JDK 9 开始模块化,JDK 11 彻底移除),因此升级时若依赖 Java EE 组件,会遇到 javax → jakarta 的包名变更问题。
下面列出了所有 Oinone 已知的类引入变更,可在项目中进行全局替换。其他未列出变更内容可参考文末的参考资料或自行搜索解决。
# javax.annotation.Resource
jakarta.annotation.Resource
# javax.annotation.PostConstruct
jakarta.annotation.PostConstruct
# javax.servlet.
jakarta.servlet.
# javax.validation.
jakarta.validation.
# javax.activation.
jakarta.activation.
# javax.mail.
jakarta.mail.
一些特殊情况:
- Oinone 7.x 首发版本未处理
Apache Camel升级,导致通过Exchange.HTTP_SERVLET_RESPONSE变量获取HttpServletResponse值时需要使用javax.servlet.http.HttpServletResponse而不是jakarta.servlet.http.HttpServletResponse。
6. yaml 配置变更
核心变更内容:
- 移除
bootstrap.yml,使用新的profiles指定方式。 - 使用
spring.main.allow-circular-references=true启用 Spring 循环依赖处理。 Spring Data相关配置升级,以Redis为例,配置前缀由spring.redis改为spring.data.redis。
具体变更步骤
- 移除
bootstrap.yml改为使用application.yml作为公共配置。
application.yml
spring:
profiles:
active: dev
main:
allow-circular-references: true
application:
name: pamirs-demo
cloud:
service-registry:
auto-registration:
enabled: false
config:
enabled: false
uri: http://127.0.0.1:7001
label: master
profile: dev
nacos:
server-addr: http://127.0.0.1:8848
discovery:
enabled: false
namespace:
prefix: application
file-extension: yml
config:
enabled: false
namespace:
prefix: application
file-extension: yml
dubbo:
application:
name: pamirs-demo
version: 1.0.0
register-consumer: false
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: -1
serialization: pamirs
payload: 104857600
scan:
base-packages: pro.shushi
cloud:
subscribed-services:
pamirs:
default:
environment-check: true
tenant-check: true
变更要点:
spring.profiles.active配置用于指定具体环境配置后缀,下面的配置示例指向application-dev.yml配置文件。spring.main.allow-circular-references=true:Spring 不再主动处理循环依赖引用问题,需要显式启用,目前 Oinone 暂不支持关闭,未来会陆续支持。
application-dev.yml配置变更
# spring:
# profiles: dev
spring:
config:
activate:
on-profile: dev
- Redis 配置由
spring.redis前缀改为spring.data.redis前缀,其他配置可参考官方文档
# spring:
# redis:
# database: 1
# host: 127.0.0.1
# port: 6379
# timeout: 2000
spring:
data:
redis:
database: 1
host: 127.0.0.1
port: 6379
timeout: 2000
变更要点:
- Oinone 7.x 开始将完整支持
org.springframework.boot.autoconfigure.data.redis.RedisProperties未来所有变更将跟随Spring Data Redis升级而变化。
参考资料: 按组件分类的包名变更
注: 此参考资料由 AI 生成,生成结果可能出现偏差或错误,请仔细甄别。
1. Servlet / JSP / EL(最常用)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.servlet.* | jakarta.servlet.* | 核心 Servlet API(Request/Response/Filter 等) |
| javax.servlet.http.* | jakarta.servlet.http.* | HTTP 相关 Servlet API |
| javax.servlet.annotation.* | jakarta.servlet.annotation.* | Servlet 注解(@WebServlet、@WebFilter 等) |
| javax.servlet.jsp.* | jakarta.servlet.jsp.* | JSP 核心 API |
| javax.servlet.jsp.tagext.* | jakarta.servlet.jsp.tagext.* | JSP 标签扩展 |
| javax.el.* | jakarta.el.* | 表达式语言(EL) |
| javax.servlet.jsp.el.* | jakarta.servlet.jsp.el.* | JSP EL 集成 |
2. JPA(持久化)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.persistence.* | jakarta.persistence.* | JPA 核心 API(@Entity、@Table、EntityManager 等) |
| javax.persistence.criteria.* | jakarta.persistence.criteria.* | JPA 条件查询 |
| javax.persistence.metamodel.* | jakarta.persistence.metamodel.* | JPA 元模型 |
| javax.persistence.spi.* | jakarta.persistence.spi.* | JPA 服务提供接口 |
3. JAX-RS(RESTful)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.ws.rs.* | jakarta.ws.rs.* | JAX-RS 核心 API(@GET、@POST、Path 等) |
| javax.ws.rs.client.* | jakarta.ws.rs.client.* | 客户端 API |
| javax.ws.rs.core.* | jakarta.ws.rs.core.* | 核心对象(Response、MediaType 等) |
| javax.ws.rs.ext.* | jakarta.ws.rs.ext.* | 扩展接口 |
4. JAX-WS(WebService)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.xml.ws.* | jakarta.xml.ws.* | JAX-WS 核心 API |
| javax.xml.ws.handler.* | jakarta.xml.ws.handler.* | 处理器 API |
| javax.xml.ws.http.* | jakarta.xml.ws.http.* | HTTP 绑定 |
| javax.jws.* | jakarta.jws.* | WebService 注解(@WebService、@WebMethod 等) |
| javax.xml.bind.* | jakarta.xml.bind.* | JAXB(XML 绑定,JDK 8 内置,JDK 11+ 需手动引入) |
| javax.xml.bind.annotation.* | jakarta.xml.bind.annotation.* | JAXB 注解(@XmlRootElement 等) |
5. JMS(消息队列)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.jms.* | jakarta.jms.* | JMS 核心 API(Connection、Session、Message 等) |
6. Bean Validation(参数校验)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.validation.* | jakarta.validation.* | 校验核心 API(@Valid、@NotNull、Validator 等) |
| javax.validation.constraints.* | jakarta.validation.constraints.* | 内置校验注解 |
| javax.validation.groups.* | jakarta.validation.groups.* | 校验分组 |
7. CDI(依赖注入)
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.enterprise.context.* | jakarta.enterprise.context.* | CDI 上下文(@RequestScoped、@SessionScoped 等) |
| javax.enterprise.inject.* | jakarta.enterprise.inject.* | CDI 注入(@Inject、@Named 等) |
| javax.inject.* | jakarta.inject.* | JSR-330 依赖注入(Spring 也依赖此包) |
8. 其他常用组件
| 原 JDK 8/Java EE 包名 | JDK 17/Jakarta EE 包名 | 说明 |
|---|---|---|
| javax.annotation.* | jakarta.annotation.* | 通用注解(@Resource、@PostConstruct、@PreDestroy 等) |
| javax.transaction.* | jakarta.transaction.* | 事务 API(@Transactional、UserTransaction 等) |
| javax.mail.* | jakarta.mail.* | JavaMail 邮件 API |
| javax.json.* | jakarta.json.* | JSON 处理 API |
| javax.faces.* | jakarta.faces.* | JSF 前端框架 |
Oinone社区 作者:张博昊原创文章,如若转载,请注明出处:https://doc.oinone.top/version/25243.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验