有没有动态切换 jdk 版本的工具

2023-07-21 14:26:12 +08:00
 Comyn
rt
flutter 有 fvm,node 有 nvm,python 有 pyenv,没见到切换 jdk 的,虽说可以自己写简单的脚本实现
5308 次点击
所在节点    Java
40 条回复
maojun
2023-07-21 20:14:00 +08:00
macOS 自带了一个 java_home 工具
fanxasy
2023-07-21 23:10:48 +08:00
sdkman + 1 越来越多的 java 相关项目推荐用 sdkman 安装 jdk 了
Slurp
2023-07-22 02:03:58 +08:00
sdkman / jenv / asdf

另外分享一个在 macOS 上动态更新 jenv 的脚本,需要 jenv 自身、Zsh 、fd ,支持用 .pkg 安装的 JDK 和 brew 装的 openjdk 。

update-jenvs () {
eval "$(jenv init -)"
/bin/rm -rf "~/.jenv"
local readonly jenv_global="$(jenv global)"
fd --type directory --regex '.*\.jdk' /Library/Java/JavaVirtualMachines -x jenv add '{}/Contents/Home'
fd --type directory --regex 'openjdk\.jdk' --exact-depth=4 "$(brew --prefix)/Cellar/" -x jenv add '{}/Contents/Home'
fd -t=file --glob '*zulu*.pkg' "$(brew --prefix)/Caskroom/" -X rm -rf '{}'
jenv rehash
jenv global "$jenv_global"
}
james122333
2023-07-22 05:01:22 +08:00
很简单 随便写个很不重要的 wrapper 就搞定(不重要分享一下)
要选项挑选请自行写另外一隻程序
使用方式就是

/usr/bin/jdksh -d JAVA_HOME 位置 剩下的 bash 参数...(如-c "java -version")

#!/usr/bin/env bash

function err {
echo "$@" >&2
}

function help {
err "$0 -d JDK_HOME [bash arg...]"
}

function check_jdk_home {
local bins=(java javac)
if [[ -d "$1" && -x "$1" ]] ; then
local i
for i in ${bins[@]}
do
if [[ ! -f "$1/bin/$i" || ! -x "$1/bin/$i" ]] ; then
err "$0: $1/bin/$i program not found!"
return 1
fi
done
return 0
fi
return 1
}

function set_jdk_home {
if [[ -d "$1" && -x "$1" ]] ; then
cd "$1"
export JAVA_HOME="$PWD"
export PATH="$JAVA_HOME"/bin:$PATH
cd - > /dev/null
return 0
fi
return 1
}

function parse_args {
while let $#
do
case "$1" in
-d)
shift
case "$1" in
""|-*)
err "$0: directory not defined!"
[[ "$1" == -* ]] && continue
;;
esac
check_jdk_home "$1" && set_jdk_home "$1"
;;
*)
args[${#args[@]}]="$1"
;;
esac
shift
done
if [[ -z "$JAVA_HOME" ]] ; then
err "$0: JAVA_HOME not defined!"
exit 1
fi
}

function main {
trap help EXIT
local JAVA_HOME args=()
parse_args "$@"
exec bash "${args[@]}"
}

main "$@"
james122333
2023-07-22 05:04:42 +08:00
没有 bash 选项就是纯开终端
james122333
2023-07-22 05:13:20 +08:00
local JAVA_HOME 前改成 local JAVA_HOME PATH 更好
james122333
2023-07-22 07:33:13 +08:00
/usr/bin/jdkrun

#!/usr/bin/env bash

function err {
echo "$@" >&2
}

function help {
err "$0 -a(add) [JAVA_HOME]/-r(remove) [JAVA_HOME]/-l(list)/-d [JAVA_HOME] [bash arg...]"
}

function parse_config {
if [[ ! -f "$jdk_versions_file" || ! -r "$jdk_versions_file" ]] ; then
rm -Rf "$jdk_versions_file"
: > "$jdk_versions_file"
else
local l
while read -r l
do
jdks[${#jdks[@]}]="$l"
done < "$jdk_versions_file"
fi
}

function list_versions {
local i=-1
while let "++i < ${#jdks[@]}"
do
echo "${jdks[i]}"
done
}

function check_added_version {
local i=-1 v="$1"
v="${v## }"
v="${v%% }"
if [[ ! -z "$v" ]] ; then
while let "++i < ${#jdks[@]}"
do
[[ "${jdks[i]%\/}" == "${v%\/}" ]] && return 0
done
else
return 0
fi
return 1
}

function delete_version {
local i=-1
while let "++i < ${#jdks[@]}"
do
[[ "${jdks[i]%\/}" != "${1%\/}" ]] && echo "${jdks[i]%\/}"
done > "${jdk_versions_file}"
return 1
}

function main {
local jdk_versions_file="$HOME/.jdk_versions" jdks=()
parse_config
if [[ "$1" == -d ]] ; then
shift
case "$1" in
""|-*)
local i IFS=$'\n'
select i in ${jdks[@]}
do
exec jdksh -d "$i" "$@"
done
unset IFS
;;
*)
if check_added_version "$1" ; then
local d="$1"
shift
exec jdksh -d "$d" "$@"
else
err "$0: no such jdk version!"
return 1
fi
;;
esac
return 1
fi
case "$#" in
2)
case "$1" in
-a)
check_added_version "$2" || echo "${2%\/}" >> "${jdk_versions_file}"
;;
-r)
delete_version "$2"
;;
*)
help
;;
esac
;;
1)
case "$1" in
-a)
local l
read -p "Please input JAVA_HOME directory: " -r l
check_added_version "$l" || echo "${2%\/}" >> "${jdk_versions_file}"
;;
-r)
local i IFS=$'\n'
select i in ${jdks[@]}
do
delete_version "$i"
break
done
;;
-l)
list_versions
;;
*)
help
;;
esac
;;
*)
help
;;
esac
}

main "$@"
james122333
2023-07-22 07:49:38 +08:00
倒数 25 行 2 改 l
james122333
2023-07-22 08:02:45 +08:00
以上可以捨弃肥大的工具
houshuu
2023-07-22 08:33:12 +08:00
jenv 好,可以自己加各种 jdk ,比如 idea 内下载的,brew 下载的等等
random1221
2023-07-22 10:06:29 +08:00
@james122333 #29
如何理解你这句话?
sleepybear1113
2023-07-22 10:11:34 +08:00
https://blog.csdn.net/qq_36670734/article/details/123836164

很久之前写的 Linux 多 Java 直接用的方法

# 使用 Java 17 来运行 Jar 包
java17 -jar test-17.jar

# 使用 Java 8 来运行 Jar 包
java8 -jar test-8.jar

# 使用 nohup 不挂断来后台运行 Jar 包
nohup java17 -jar test-17.jar &
samli12
2023-07-22 10:12:04 +08:00
https://modules.readthedocs.io/en/latest/ module file ,想配什么都可以,直接 module load/unload/switch
cq65617875
2023-07-22 14:15:53 +08:00
anaconda ?
knightdf
2023-07-22 14:18:24 +08:00
jenv 不知道么?
WispZhan
2023-07-22 14:29:51 +08:00
asdf-vm
james122333
2023-07-22 16:43:16 +08:00
@random1221

意思是不用使用複杂依赖多或非原生的方式就可以实现
以上写的脚本也不用写入.bash_profile
james122333
2023-07-22 17:05:53 +08:00
@random1221

然后不只 java 很多东西都可以这样搞 两个档是可以合并 但脚本会杂一点 我看过 jenv 複杂很多的东西 不够轻量
awolf
2023-07-22 17:29:42 +08:00
docker 时代了更加方便了
yiyiniu
2023-11-30 15:40:33 +08:00
@Comyn 有工具能动态切换 JDK ,我也有在用,看看这个工具: https://jp.v2ex.com/t/992876

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/958600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX