1.前言
当一个服务器因为各种原因需要安装多版本的 Java 的时候,切换不同环境运行 Java 费时费力,如果直接跟对应版本 Java 的全路径又麻烦。此处使用简便的方法,不切换环境变量即可做到如下的操作。
# 使用 Java 11 来运行 Jar 包
java11 -jar test-11.jar
# 使用 Java 8 来运行 Jar 包
java8 -jar test-8.jar
# 使用 nohup 不挂断来后台运行 Jar 包
nohup java11 -jar test-11.jar &
# 全路径运行
/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java -jar test-11.jar
2.原理
使用 Linux 下 shell 脚本来运行 Java,如下:
test.sh 文件
/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java -jar test-11.jar
上述 shell 脚本运行之后,即可在 Java 11 环境下运行 test-11.jar 文件。同理,利用好 shell 脚本就能实现 Java 版本自由。
3.做法
在可以引用到全局的路径下,如 /usr/bin 目录下新建 java11 文件,写入如下语句:
#[你的 Java bin 路径] ${@:1}
# 我本地的如下
/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java ${@:1}
然后赋予运行的权限,如使用 chmod 777 java17 来确保这个文件有全局运行的权限。
4.脚本说明
前一部分,也就是 /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java 这块语句,就是本机要使用的 Java 的 bin 目录的路径;后一部分 ${@:1} 则是命令行参数,从索引 index = 1 to end 的所有参数。
如果命令如下:java11 -jar test-11.jar --spring.profiles.active=dev,那么 ${@:1} 代表的就是 -jar test-11.jar --spring.profiles.active=dev 的内容。也就是在 dev 环境下运行了对应的 Jar 包。
5.其他
按照上述配置后,运行如下代码可以出现如下不同的 version,更加说明了脚本的可用性。
java11 --version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS, mixed mode, sharing)
java8 -version
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)
6.其他注意事项
当使用如上方法并使用 nohup 不挂断运行之后,查看运行的进程后,可以看到两个进程,一个是 shell 进程,一个是 Java 进程。如果只 kill shell 进程之后,Java 仍会继续运行。如果只 kill Java 进程,那么两个都会结束。所以 kill 的时候注意进程区分。
7.总结
上述利用 shell 来执行不同版本的 Java,同样可以转移到其他不同版本的软件中,或者给其他 Java 命令配置不同的环境,比如 javac、jstack 等。
这样子做了之后,就能更加快捷地使用不同环境的软件。