java工具
2023/8/25大约 5 分钟
下载
openjdk 下载官网: https://jdk.java.net/archive/
jdk 下载官网: https://www.oracle.com/java/technologies/downloads/
将资源文件加载为 String
ClassPathResource resource = new ClassPathResource("/xxx/xxx.json");
String recentsJson = StreamUtils.copyToString(
resource.getInputStream(), Charset.defaultCharset());脚本配置环境变量
手动配置 Java 环境变量?不可能,无脑操作必须自动化!可使用如下脚本一键在 Windows 或 Linux 系统中配置环境变量,特点:相同就跳过、不同才更新、没有才新增,反复运行都安全。
如果你很悠闲,想在 Linux 中手动配置 Java 环境变量,可参考Linux 安装 Java
Windows
脚本写入【用户】变量、无需管理员权限:
一键设置环境变量
@echo off
setlocal enabledelayedexpansion
REM 本文件必须以 ANSI(GBK)编码保存(记事本「另存为」时编码选 ANSI),否则中文会乱码
REM 这是个设置用户环境变量的脚本,唯一需要改的就是下面的配置区
REM ===================== 配置区 =====================
REM 安装目录,换版本只改这一行,下面的配置全部从它推导
set "INSTALL_PATH=D:\application\java\jdk-21"
REM 格式:set "MAP[变量名]=变量值" —— 像 map 一样,键在[]里,值在=右边
REM 新增变量:照着下面再加一行即可,无需改动其它任何地方
set "MAP[JAVA_HOME]=%INSTALL_PATH%"
REM 追加到 Path 末尾的条目,分号分隔(%INSTALL_PATH% 由上面的 set 展开,写入的仍是全路径)
set "PATH_ENTRY=%INSTALL_PATH%\bin"
REM ===============================================================
echo 正在写入【用户】环境变量(不影响系统变量和其它已有变量)...
echo.
REM 遍历所有 MAP[...] 变量:%%K 取到 "MAP[键]",%%L 取到值
for /f "tokens=1,* delims==" %%K in ('set MAP[ 2^>nul') do (
set "KEY=%%K"
set "VALUE=%%L"
REM 从 "MAP[键]" 中剥掉前缀 MAP[ 和后缀 ] ,得到纯键名
set "KEY=!KEY:MAP[=!"
set "KEY=!KEY:]=!"
call :SetUserEnv "!KEY!" "!VALUE!"
)
call :AppendUserPath "%PATH_ENTRY%"
REM 全部写入后广播一次变更通知,让新开终端立即可用(无需注销)
call :NotifyEnvChange
echo.
echo 完成!请关闭并重新打开终端后才会生效。
pause
exit /b
REM ---------- 子程序:设置单个用户环境变量(幂等,不会重复添加)----------
:SetUserEnv
set "NAME=%~1"
set "VALUE=%~2"
set "CURRENT="
REM 读取注册表里该变量当前的值,不存在则 CURRENT 为空
for /f "tokens=2,* delims= " %%a in ('reg query "HKCU\Environment" /v "%NAME%" 2^>nul ^| findstr /i "%NAME%"') do set "CURRENT=%%b"
if "!CURRENT!"=="%VALUE%" (
echo [跳过] %NAME% 已存在且值相同。
) else (
REM setx 不带 /M = 只写入【用户】变量,且只覆盖这一个变量
setx "%NAME%" "%VALUE%" >nul
if "!CURRENT!"=="" (
echo [新增] %NAME% = %VALUE%
) else (
echo [更新] %NAME% : !CURRENT! -^> %VALUE%
)
)
exit /b
REM ---------- 子程序:向用户 Path 幂等追加条目 ----------
:AppendUserPath
set "ENTRY=%~1"
set "CURRENT="
for /f "tokens=2,* delims= " %%a in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr /i /c:"Path"') do set "CURRENT=%%b"
echo !CURRENT! | findstr /i /c:"%ENTRY%" >nul
if not errorlevel 1 (
echo [跳过] Path 已包含 %ENTRY%
exit /b
)
REM 末尾若已带分号,先去掉,避免拼接出 ;;
if "!CURRENT:~-1!"==";" set "CURRENT=!CURRENT:~0,-1!"
REM 用 reg add 保持 Path 的 REG_EXPAND_SZ 类型(setx 会改成 REG_SZ,导致 %变量% 不展开)
if "!CURRENT!"=="" (
reg add "HKCU\Environment" /v Path /t REG_EXPAND_SZ /d "%ENTRY%" /f >nul
) else (
reg add "HKCU\Environment" /v Path /t REG_EXPAND_SZ /d "!CURRENT!;%ENTRY%" /f >nul
)
echo [追加] Path += %ENTRY%
exit /b
REM ---------- 子程序:广播环境变量变更通知 ----------
REM setx 写入时自带广播,但 reg add / reg delete 不会;资源管理器收到广播才会重读注册表,
REM 之后由它启动的新终端才能拿到最新变量,否则要注销/重启才生效
:NotifyEnvChange
powershell -NoProfile -Command "$s='[DllImport(\"user32.dll\",CharSet=CharSet.Auto)]public static extern IntPtr SendMessageTimeout(IntPtr hWnd,uint Msg,UIntPtr wParam,string lParam,uint fuFlags,uint uTimeout,out UIntPtr lpdwResult);';$t=Add-Type -MemberDefinition $s -Name NM -Namespace Win32 -PassThru;$r=[UIntPtr]::Zero;[void]($t::SendMessageTimeout([IntPtr]0xFFFF,0x1A,[UIntPtr]::Zero,'Environment',2,5000,[ref]$r))"
exit /b一键清除环境变量
@echo off
setlocal enabledelayedexpansion
REM 本文件必须以 ANSI(GBK)编码保存(记事本「另存为」时编码选 ANSI),否则中文会乱码
REM ===================== 配置区(与设置脚本保持一致)=====================
REM 安装目录,与设置脚本保持同一份
set "INSTALL_PATH=D:\application\java\jdk-21"
REM 要移除的变量名,空格分隔
set "KEYS=JAVA_HOME"
REM 要从 Path 中移除的条目
set "PATH_ENTRY=%INSTALL_PATH%\bin"
REM ===============================================================
echo 正在从【用户】环境变量中移除...
echo.
for %%K in (%KEYS%) do call :DelUserEnv "%%K"
call :RemoveUserPath "%PATH_ENTRY%"
REM 全部移除后广播一次变更通知,让新开终端立即感知
call :NotifyEnvChange
echo.
echo 完成!请关闭并重新打开终端后才会生效。
pause
exit /b
REM ---------- 子程序:删除单个用户环境变量(不存在则跳过)----------
:DelUserEnv
set "NAME=%~1"
reg query "HKCU\Environment" /v "%NAME%" >nul 2>nul
if errorlevel 1 (
echo [跳过] %NAME% 本来就不存在。
) else (
reg delete "HKCU\Environment" /v "%NAME%" /f >nul
echo [删除] %NAME% 已移除。
)
exit /b
REM ---------- 子程序:从用户 Path 中移除条目(没有则跳过)----------
:RemoveUserPath
set "ENTRY=%~1"
set "CURRENT="
for /f "tokens=2,* delims= " %%a in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr /i /c:"Path"') do set "CURRENT=%%b"
if "!CURRENT!"=="" (
echo [跳过] Path 本来就不存在。
exit /b
)
echo !CURRENT! | findstr /i /c:"%ENTRY%" >nul
if errorlevel 1 (
echo [跳过] Path 中没有 %ENTRY%
) else (
REM 先删中间出现(;条目),再删开头出现(条目;)的情况
set "NEW=!CURRENT:;%ENTRY%=!"
set "NEW=!NEW:%ENTRY%;=!"
set "NEW=!NEW:%ENTRY%=!"
reg add "HKCU\Environment" /v Path /t REG_EXPAND_SZ /d "!NEW!" /f >nul
echo [移除] Path -= %ENTRY%
)
exit /b
REM ---------- 子程序:广播环境变量变更通知 ----------
REM setx 写入时自带广播,但 reg add / reg delete 不会;资源管理器收到广播才会重读注册表,
REM 之后由它启动的新终端才能拿到最新变量,否则要注销/重启才生效
:NotifyEnvChange
powershell -NoProfile -Command "$s='[DllImport(\"user32.dll\",CharSet=CharSet.Auto)]public static extern IntPtr SendMessageTimeout(IntPtr hWnd,uint Msg,UIntPtr wParam,string lParam,uint fuFlags,uint uTimeout,out UIntPtr lpdwResult);';$t=Add-Type -MemberDefinition $s -Name NM -Namespace Win32 -PassThru;$r=[UIntPtr]::Zero;[void]($t::SendMessageTimeout([IntPtr]0xFFFF,0x1A,[UIntPtr]::Zero,'Environment',2,5000,[ref]$r))"
exit /bLinux
所有变量集中写入独立的 /etc/profile.d/java-env.sh,不污染 /etc/profile 本体,卸载时删文件即可:
一键设置环境变量
# 变量统一写进独立文件,重复执行只覆盖、不会追加(幂等)
sudo tee /etc/profile.d/java-env.sh > /dev/null <<'EOF'
export JAVA_HOME=/usr/local/java/jdk-21
export PATH=$JAVA_HOME/bin:$PATH
# 需要其它变量(如 MAVEN_HOME)直接在下面追加 export 行即可
# export MAVEN_HOME=/usr/local/maven/apache-maven-3.8.1
# export PATH=$MAVEN_HOME/bin:$PATH
EOF
# 让当前终端立即生效;新开的终端会自动加载,无需 source
source /etc/profile.d/java-env.sh一键清除环境变量
# 删掉独立文件即完成卸载
sudo rm -f /etc/profile.d/java-env.sh
# 当前终端里的变量立即清空
unset JAVA_HOME
