7.0.0升级详细说明及步骤

开发和运行环境服务升级

1. 安装JDK17

点击打开JDK17下载页面

根据本地开发系统环境选择合适的安装包进行下载并使用

注意事项:

  1. 安装jdk17
  2. JAVA_HOME/PATH 环境变量配置

2. RocketMQ 升级

推荐升级至 4.8.x 版本

点击下载4.8.0版本

注:若 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.shrunbroker.sh 运行脚本进行适配。在使用 cmd 脚本的运行环境中,可通过修改 runserver.cmdrunbroker.cmd 运行脚本进行适配。

下面提供了基于 4.5.2 版本修改后的 runserver.shrunbroker.sh 脚本进行参考。
修改运行脚本仅适用于无法升级中间件版本的特殊环境,下面提供的修改后的脚本,只能保证收发消息功能正常,无法保证其他功能的正常使用。

核心变更内容:

  1. JAVA_OPT 配置使用 --add-opens 参数以支持非模块化内置包在运行代码中的使用。
  2. 移除 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 版本

点击下载3.9.4版本

注: 若 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.compilerjava.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.

一些特殊情况:

  1. Oinone 7.x 首发版本未处理 Apache Camel 升级,导致通过 Exchange.HTTP_SERVLET_RESPONSE 变量获取 HttpServletResponse 值时需要使用 javax.servlet.http.HttpServletResponse 而不是 jakarta.servlet.http.HttpServletResponse

6. yaml 配置变更

核心变更内容:

  1. 移除 bootstrap.yml,使用新的 profiles 指定方式。
  2. 使用 spring.main.allow-circular-references=true 启用 Spring 循环依赖处理。
  3. Spring Data 相关配置升级,以 Redis 为例,配置前缀由 spring.redis 改为 spring.data.redis

具体变更步骤

  1. 移除 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 暂不支持关闭,未来会陆续支持。
  1. application-dev.yml 配置变更
# spring:
#   profiles: dev

spring:
  config:
    activate:
      on-profile: dev
  1. 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低代码应用平台体验

(0)
张博昊的头像张博昊数式管理员
上一篇 2小时前
下一篇 2小时前

相关推荐

  • 5.2.0版本feature:新增日期格式国际化功能,请升级对应版本

    版本号: 5.2.9 版本发布日期:2024.11.08更新要点:新增日期格式国际化功能 5.2.0 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.2.0) 新增日期格式国际化功能 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <pamirs.middleware.version>5.2.3</pamirs.middleware.version> <pamirs.k2.version>5.2.6</pamirs.k2.version> <pamirs.framework.version>5.2.8</pamirs.framework.version> <pamirs.boot.version>5.2.9</pamirs.boot.version> <pamirs.distribution.version>5.2.7</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.2.1</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.2.0</pamirs.designer.metadata.version> <pamirs.core.version>5.2.10</pamirs.core.version> <pamirs.workflow.version>5.2.2</pamirs.workflow.version> <pamirs.workbench.version>5.2.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.2.5</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.2.1</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.2.2</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>5.2.0</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.2.3</pamirs.model.designer.version> <pamirs.ui.designer.version>5.2.6</pamirs.ui.designer.version> <pamirs.data.designer.version>5.2.4</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.2.0</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.2.3</pamirs.eip.designer.version> 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.9-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.9-arm64 镜像拉取 镜像或JAR版本:5.2.9 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.9 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.2:5.2.9 流程设计器镜像:(包含前后端服务,仅包含流程设计器) docker pull harbor.oinone.top/oinone/workflow-designer-v5.2:5.2.9 后端镜像:(仅包含后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/designer-backend-v5.2:5.2.9 前端镜像:(仅包含前端服务,包含全部设计器) PS:前端镜像版本为独立版本,与其他镜像版本不同。原基础镜像为nginx-1.21.0版本,从5.0.7版本开始使用nginx-1.24.0版为基础镜像 docker pull harbor.oinone.top/oinone/designer-frontend-v5.2:5.2.9 独立部署所有设计器JAR:(后端服务,包含所有设计器)pamirs-designer-boot-v5.2-5.2.9.jarpamirs-designer-boot-v5.2-latest.jar 独立部署流程设计器JAR:(后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-v5.2-5.2.9.jarpamirs-workflow-designer-boot-v5.2-latest.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年11月8日
    1.1K00
  • 4.7.8.18 版本升级说明-20240701

    版本号: 4.7.8.18 版本发布日期:2024.07.01更新要点:修复Excel导入时的时间类型获取少了5分43秒的问题 4.7.8.18 版本 升级内容 修复Excel导入时的时间类型获取少了5分43秒的问题 优化业务审计日志记录服务扩展性 版本包信息 未使用到的版本号请忽略,按项目中使用到的进行替换 <!– 平台基础 –> <pamirs.middleware.version>4.7.8.5</pamirs.middleware.version> <pamirs.k2.version>4.7.8.5</pamirs.k2.version> <pamirs.framework.version>4.7.8.13</pamirs.framework.version> <pamirs.boot.version>4.7.8.9</pamirs.boot.version> <pamirs.distribution.version>4.7.8.3</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>4.7.8</pamirs.metadata.manager> <pamirs.core.version>4.7.8.13</pamirs.core.version> <pamirs.workflow.version>4.7.8.10</pamirs.workflow.version> <pamirs.workbench.version>4.7.8</pamirs.workbench.version> <pamirs.data.visualization.version>4.7.8</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>4.7.8</pamirs.designer.common.version> <pamirs.flow.designer.base.version>4.7.8.1</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>4.7.8</pamirs.workflow.designer.version> <pamirs.model.designer.version>4.7.8</pamirs.model.designer.version> <pamirs.ui.designer.version>4.7.8.9</pamirs.ui.designer.version> <pamirs.data.designer.version>4.7.8</pamirs.data.designer.version> <pamirs.dataflow.designer.version>4.7.8.1</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>4.7.8.1</pamirs.eip.designer.version> 注意镜像名称变化 体验镜像:(所有中间件及前后端服务,包含全部设计器)docker pull harbor.oinone.top/oinone/oinone-designer-full-v4.8:4.8.9 部署镜像:(包含前后端服务,包含全部设计器)docker pull harbor.oinone.top/oinone/oinone-designer-mini-v4.8:4.8.9 流程设计器镜像:(包含前后端服务,仅包含流程设计器)docker pull harbor.oinone.top/oinone/workflow-designer-v4.8:4.8.9 流程设计器镜像:(包含前后端服务,仅包含流程设计器,非外部库镜像)docker pull harbor.oinone.top/oinone/workflow-designer-standard-v4.8:4.8.9 独立部署流程设计器JAR:(包含前后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-4.8.9.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年7月1日
    98200
  • 5.3.0版本bugfix:弹窗和抽屉新增全屏功能,请升级对应版本

    版本号: 5.3.6 版本发布日期:2025.01.17更新要点:弹窗和抽屉新增全屏功能 5.3.0 版本 升级说明及步骤(已升级为5.0.0版本忽略) 5.3.x版本以后无法通过4.7.8版本进行升级,请先升级到5.2.x版本进行权限迁移后再升级至5.3.x版本 升级内容(5.3.0) 弹窗和抽屉标题支持表达式配置 弹窗和抽屉支持高度及全屏配置 弹窗和抽屉支持遮罩交互配置 新增动作的二次确认支持表达式配置 动作执行后新增关闭所有弹窗开关 优化审批、填写来源合并 修复动作上下文的value配置false不生效 修复模型导出无法导出数据字典的问题 修复折线图对比数据显示错误 优化协同开发时ownSign参数优先与schedule的ownSign生效 修复统计图表添加多个数值的时候,属性面板发生变化后设计区域没有更新 修复界面设计器图表的查询条件不回填 修复图表的动态条件无法正确覆盖的问题 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm run clean && npm install即可自动升级到最新版本 后端版本包信息 Oinone平台部署及依赖说明(v5.1) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <oinone.version>5.3.6.2</oinone.version> <!– 设计器 –> <pamirs.workflow.designer.version>5.3.0</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.3.6</pamirs.model.designer.version> <pamirs.ui.designer.version>5.3.6</pamirs.ui.designer.version> <pamirs.data.designer.version>5.3.0</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.3.0</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.3.0</pamirs.eip.designer.version> <pamirs.microflow.designer.version>5.3.0</pamirs.microflow.designer.version> <dependencyManagement> <dependencies> <dependency> <groupId>pro.shushi</groupId> <artifactId>oinone-bom</artifactId> <version>${oinone.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> oinone-bom详细版本信息 <!– 平台基础 –> <pamirs.middleware.version>5.2.3</pamirs.middleware.version> <pamirs.k2.version>5.3.1</pamirs.k2.version> <pamirs.framework.version>5.3.3</pamirs.framework.version> <pamirs.boot.version>5.3.3</pamirs.boot.version> <pamirs.distribution.version>5.3.1</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.3.1</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.3.2</pamirs.designer.metadata.version> <pamirs.core.version>5.3.9</pamirs.core.version> <pamirs.workflow.version>5.3.9</pamirs.workflow.version> <pamirs.workbench.version>5.3.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.3.2</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.3.0</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.3.7</pamirs.flow.designer.base.version> 前端版本包信息 { "@kunlun/vue-dependencies": "5.3.15", "@kunlun/vue-ui-antd": "5.3.15", "@kunlun/vue-ui-el": "5.3.15", "@kunlun/vue-mobile-dependencies": "5.3.6", "@kunlun/vue-ui-mobile-vant": "5.3.6", "@kunlun/mobile-workbench": "5.3.6", "@kunlun/data-designer-open-pc": "5.3.0", "@kunlun/data-designer-open-mobile": "5.3.0" } 前端详细版本信息 可通过node_modules/@kunlun查看 { "@kunlun/cache": "5.3.5", "@kunlun/dsl": "5.3.5", "@kunlun/environment": "5.3.5", "@kunlun/event": "5.3.5", "@kunlun/expression": "5.3.5", "@kunlun/meta": "5.3.5", "@kunlun/request": "5.3.5", "@kunlun/router": "5.3.5", "@kunlun/service": "5.3.5", "@kunlun/shared": "5.3.5", "@kunlun/spi": "5.3.5", "@kunlun/state": "5.3.5", "@kunlun/theme": "5.3.5", "@kunlun/engine": "5.3.6", "@kunlun/vue-admin-base": "5.3.15", "@kunlun/vue-admin-layout": "5.3.15", "@kunlun/vue-dependencies": "5.3.15", "@kunlun/vue-router": "5.3.15", "@kunlun/vue-ui": "5.3.15", "@kunlun/vue-ui-antd": "5.3.15", "@kunlun/vue-ui-common": "5.3.15", "@kunlun/vue-ui-el": "5.3.15", "@kunlun/vue-widget": "5.3.15", "@kunlun/vue-expression": "5.3.1", "@kunlun/vue-mobile-base": "5.3.6", "@kunlun/vue-mobile-dependencies": "5.3.6", "@kunlun/vue-ui-mobile-vant": "5.3.6", "@kunlun/mobile-workbench": "5.3.1", "@kunlun/data-designer-core": "5.3.0", "@kunlun/data-designer-core-mobile": "5.3.0", "@kunlun/data-designer-core-pc": "5.3.0", "@kunlun/data-designer-open-mobile": "5.3.0", "@kunlun/data-designer-open-pc": "5.3.0" } 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.3:5.3.6.2-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.3:5.3.6.2-arm64 镜像拉取 镜像或JAR版本:5.3.6.2 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker…

    2025年1月16日
    4.9K00
  • 5.0.4版本feature:新增默认视图支持选择默认宽度功能,请升级对应版本

    版本号: 5.0.10 版本发布日期:2024.07.26更新要点:默认视图支持选择默认宽度 5.0.10 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.0.0) 默认视图支持选择默认宽度 文件/图片组件支持使用PamirsFile 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <pamirs.middleware.version>5.0.2</pamirs.middleware.version> <pamirs.k2.version>5.0.8</pamirs.k2.version> <pamirs.framework.version>5.0.22</pamirs.framework.version> <pamirs.boot.version>5.0.14</pamirs.boot.version> <pamirs.distribution.version>5.0.5</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.0.1</pamirs.metadata.manager> <pamirs.core.version>5.0.31</pamirs.core.version> <pamirs.workflow.version>5.0.9</pamirs.workflow.version> <pamirs.workbench.version>5.0.3</pamirs.workbench.version> <pamirs.data.visualization.version>5.0.3</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.0.4</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.0.3</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>5.0.2</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.0.2</pamirs.model.designer.version> <pamirs.ui.designer.version>5.0.12</pamirs.ui.designer.version> <pamirs.data.designer.version>5.0.2</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.0.3</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.0.4</pamirs.eip.designer.version> 注意镜像名称变化 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.10-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.10-arm64 镜像拉取 镜像或JAR版本:5.0.10 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.10 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.0:5.0.10 流程设计器镜像:(包含前后端服务,仅包含流程设计器) PS:原workflow-designer-standard-v5.0镜像不再提供,请更换为该镜像。 docker pull harbor.oinone.top/oinone/workflow-designer-v5.0:5.0.10 后端镜像:(仅包含后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/designer-backend-v5.0:5.0.10 前端镜像:(仅包含前端服务,包含全部设计器) PS:前端镜像版本为独立版本,与其他镜像版本不同。原基础镜像为nginx-1.21.0版本,从5.0.8版本开始使用nginx-1.24.0版为基础镜像 docker pull harbor.oinone.top/oinone/designer-frontend-v5.0:5.0.19 独立部署所有设计器JAR:(后端服务,包含所有设计器)pamirs-designer-boot-v5.0-5.0.10.jarpamirs-designer-boot-v5.0-latest.jar 独立部署流程设计器JAR:(后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-v5.0-5.0.10.jarpamirs-workflow-designer-boot-v5.0-latest.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年7月26日
    99100
  • 5.0.4版本feature:新增选择字段导出功能,请升级对应版本

    版本号: 5.0.14 版本发布日期:2024.08.08更新要点: 修复行权限报行过滤条件重复的问题 5.0.14 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.0.0) 新增选择字段导出功能 分享按钮允许拖放至表格行内 后端请求统一改为同步执行,如需异步执行,可使用pamirs.framework.gateway.async: true进行开启。启用前请检查自定义Session是否支持子线程可见。 修复同步导出提示无权限的问题 界面设计器-客户端动作在创建时允许输入前端动作名称进行注册 界面设计器修复表单复制为详情时,在存在多对一表单时报错的问题 界面设计器修复选项页中组件无法正常拖拽的问题 界面设计器菜单绑定URL移除长度限制 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <pamirs.middleware.version>5.0.2</pamirs.middleware.version> <pamirs.k2.version>5.0.10</pamirs.k2.version> <pamirs.framework.version>5.0.25</pamirs.framework.version> <pamirs.boot.version>5.0.18</pamirs.boot.version> <pamirs.distribution.version>5.0.6</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.0.1</pamirs.metadata.manager> <pamirs.core.version>5.0.37</pamirs.core.version> <pamirs.workflow.version>5.0.9</pamirs.workflow.version> <pamirs.workbench.version>5.0.3</pamirs.workbench.version> <pamirs.data.visualization.version>5.0.3</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.0.4</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.0.3</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>5.0.2</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.0.2</pamirs.model.designer.version> <pamirs.ui.designer.version>5.0.15</pamirs.ui.designer.version> <pamirs.data.designer.version>5.0.2</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.0.3</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.0.4</pamirs.eip.designer.version> 注意镜像名称变化 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.14.3-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.14.3-arm64 镜像拉取 镜像或JAR版本:5.0.14.3 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.0:5.0.14.3 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.0:5.0.14.3 流程设计器镜像:(包含前后端服务,仅包含流程设计器) PS:原workflow-designer-standard-v5.0镜像不再提供,请更换为该镜像。 docker pull harbor.oinone.top/oinone/workflow-designer-v5.0:5.0.14.3 后端镜像:(仅包含后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/designer-backend-v5.0:5.0.14.3 前端镜像:(仅包含前端服务,包含全部设计器) PS:前端镜像版本为独立版本,与其他镜像版本不同。原基础镜像为nginx-1.21.0版本,从5.0.8版本开始使用nginx-1.24.0版为基础镜像 docker pull harbor.oinone.top/oinone/designer-frontend-v5.0:5.0.26 独立部署所有设计器JAR:(后端服务,包含所有设计器)pamirs-designer-boot-v5.0-5.0.14.3.jarpamirs-designer-boot-v5.0-latest.jar 独立部署流程设计器JAR:(后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-v5.0-5.0.14.3.jarpamirs-workflow-designer-boot-v5.0-latest.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年8月8日
    97000

Leave a Reply

登录后才能评论