Java 8 ➜ Java 17 升级:
构建 → 启动 → 依赖检查 → 运行 → 性能 → 兼容性
升级前后对比目标
这份脚本包含:
- 同时在 Java 8 和 Java 17 下编译 & 启动。
- 检查第三方依赖是否抛出 IncompatibleClassChangeError、NoClassDefFoundError。
- 基本的 JDK 特性检查(反射、SPI、模块访问)。
- 简单的压力对比(吞吐、延迟、GC 日志)。
- 输出比对结果做差异归档。
✅ 2️⃣ 脚本结构
以下示例以 Linux/macOS Shell 脚本为例(Windows 可用 PowerShell 同理):
📂 项目结构示例
plaintext复制编辑project-root/
├─ scripts/
│ ├─ build_test.sh
│ ├─ run_java8.sh
│ ├─ run_java17.sh
│ ├─ compare_results.sh
├─ pom.xml
├─ src/...
✅ 3️⃣ build_test.sh
用于切换不同 JDK 编译、清理缓存、重新打包。
bash复制编辑#!/bin/bash
set -e
echo ">>> Cleaning build..."
mvn clean
echo ">>> Build with Java 8..."
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
mvn clean package -DskipTests
cp target/app.jar target/app-java8.jar
echo ">>> Build with Java 17..."
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
mvn clean package -DskipTests
cp target/app.jar target/app-java17.jar
echo ">>> Build finished. Artifacts:"
ls -lh target/app-*.jar
✅ 4️⃣ run_java8.sh
用 Java 8 启动。
bash复制编辑#!/bin/bash
set -e
echo ">>> Running with Java 8..."
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
nohup java \
-Xmx512m \
-jar target/app-java8.jar \
> logs/java8.log 2>&1 &
echo $! > java8.pid
echo ">>> Java 8 started with PID $(cat java8.pid)"
✅ 5️⃣ run_java17.sh
用 Java 17 启动。
bash复制编辑#!/bin/bash
set -e
echo ">>> Running with Java 17..."
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
nohup java \
-Xmx512m \
-XX:+UseG1GC \
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC \
-jar target/app-java17.jar \
> logs/java17.log 2>&1 &
echo $! > java17.pid
echo ">>> Java 17 started with PID $(cat java17.pid)"
✅ 6️⃣ 简单压测对比
你可以用 ab
(Apache Bench) 或 wrk
进行对比:
bash复制编辑# Java 8
ab -n 10000 -c 50 http://localhost:8080/api/test > result_java8.txt
# Java 17
ab -n 10000 -c 50 http://localhost:8080/api/test > result_java17.txt
✅ 7️⃣ compare_results.sh
自动化对比结果。
bash复制编辑#!/bin/bash
echo "=== Comparing Results ==="
echo ">>> Java 8 response time:"
grep "Time per request" result_java8.txt
echo ">>> Java 17 response time:"
grep "Time per request" result_java17.txt
echo ">>> GC Logs:"
echo "--- Java 8 ---"
grep GC logs/java8.log | tail -10
echo "--- Java 17 ---"
grep GC logs/java17.log | tail -10
echo "=== Diff Done ==="
✅ 8️⃣ 启动后可选验证
例如:
bash复制编辑curl http://localhost:8080/actuator/health
curl http://localhost:8080/version
✅ 9️⃣ 关闭脚本
bash复制编辑#!/bin/bash
kill $(cat java8.pid)
kill $(cat java17.pid)
✅ 10️⃣ 结果对比点
检查项 | Java 8 | Java 17 |
---|---|---|
JVM 启动是否成功 | ✔ | ✔ |
是否有编译警告 | ❌ | ✔(若有模块或反射警告) |
依赖兼容性 | ✔ | 需修复 |
平均延迟 | -- | -- |
吞吐 TPS | -- | -- |
GC 行为 | CMS | G1/ZGC |