You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS安装时Apache Tomcat服务无法识别JAVA_HOME问题求助

问题根源确认

你的推测完全正确。64位Windows系统中,环境变量存在32位与64位隔离机制:32位进程(包括你使用的32位NSIS安装包)会被系统重定向到32位专属的环境变量注册表分支(HKLM\SOFTWARE\Wow6432Node),而你配置的64位JAVA_HOME存储在64位专属的HKLM\SOFTWARE分支下,因此32位PowerShell无法读取该变量,导致service.bat执行时找不到JAVA_HOME和JRE_HOME。

解决方法

方法1:强制调用64位PowerShell

让32位NSIS直接调用64位PowerShell,绕开环境变量重定向。修改NSIS脚本如下:

Section "MainSection" SEC02  
  InitPluginsDir
  ; 优先使用SysNative访问64位系统目录,兼容32位进程调用64位程序
  StrCpy $0 "$WINDIR\SysNative\WindowsPowerShell\v1.0\powershell.exe"
  IfFileExists $0 0 +2
  StrCpy $0 "$WINDIR\System32\WindowsPowerShell\v1.0\powershell.exe"
  ; 调用64位PowerShell执行脚本
  ${PowerShellExecFileLog} $0 -ExecutionPolicy Bypass -File "$INSTDIR\Tomcat-Setup.ps1"
SectionEnd

方法2:在PowerShell脚本中直接读取64位注册表

修改PowerShell脚本,从64位注册表分支读取JAVA_HOME,无需依赖环境变量:

# 从64位注册表读取JAVA_HOME(针对JDK)
$jdkVersionKey = Get-ItemProperty -Path "HKLM:\SOFTWARE\JavaSoft\Java Development Kit" -Name CurrentVersion
$javaHome = Get-ItemProperty -Path "HKLM:\SOFTWARE\JavaSoft\Java Development Kit\$($jdkVersionKey.CurrentVersion)" -Name JavaHome | Select-Object -ExpandProperty JavaHome

# 手动设置环境变量,让service.bat能识别
$env:JAVA_HOME = $javaHome
$env:JRE_HOME = Join-Path $javaHome "jre"

# 原脚本逻辑保留
$PhysMemory=(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum / 1024 / 1024 / 1024
$SERVICE_STARTUP_MODE="auto"

if($PhysMemory -le 16) {
    $JvmMX=2048
} elseif($PhysMemory -le 32) {
    $JvmMX=4096
} else {
    $JvmMX=8192
}

$JvmArgs="-Djavax.servlet.request.encoding=UTF-8;-Dfile.encoding=UTF-8;-XX:+HeapDumpOnOutOfMemoryError;-XX:+ExitOnOutOfMemoryError;-Dconf.home=$env:LGCDM_HOME\conf\service"
$CATALINA_HOME="$env:LGCDM_HOME\apache-tomcat"

Set-Location $CATALINA_HOME
& .\bin\service.bat install LG_Tomcat
Set-Service -Name LG_Tomcat -StartupType Automatic -DisplayName LG_Tomcat

方法3:NSIS读取64位环境变量后传给PowerShell

在NSIS中先读取64位注册表的JAVA_HOME,再作为参数传递给PowerShell脚本:

NSIS脚本修改

Section "MainSection" SEC02  
  InitPluginsDir
  
  ; 切换到64位注册表视图读取JAVA_HOME
  SetRegView 64
  RegRead HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" $1
  RegRead HKLM "SOFTWARE\JavaSoft\Java Development Kit\$1" "JavaHome" $2
  SetRegView 32 ; 切回默认32位视图
  
  ; 将JAVA_HOME作为参数传给PowerShell脚本
  ${PowerShellExecFileLog} "$INSTDIR\Tomcat-Setup.ps1" -JavaHome "$2"
SectionEnd

PowerShell脚本修改

param(
    [string]$JavaHome
)

# 接收参数并设置环境变量
$env:JAVA_HOME = $JavaHome
$env:JRE_HOME = Join-Path $JavaHome "jre"

# 原脚本逻辑保留
$PhysMemory=(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum / 1024 / 1024 / 1024
$SERVICE_STARTUP_MODE="auto"

if($PhysMemory -le 16) {
    $JvmMX=2048
} elseif($PhysMemory -le 32) {
    $JvmMX=4096
} else {
    $JvmMX=8192
}

$JvmArgs="-Djavax.servlet.request.encoding=UTF-8;-Dfile.encoding=UTF-8;-XX:+HeapDumpOnOutOfMemoryError;-XX:+ExitOnOutOfMemoryError;-Dconf.home=$env:LGCDM_HOME\conf\service"
$CATALINA_HOME="$env:LGCDM_HOME\apache-tomcat"

Set-Location $CATALINA_HOME
& .\bin\service.bat install LG_Tomcat
Set-Service -Name LG_Tomcat -StartupType Automatic -DisplayName LG_Tomcat

内容的提问来源于stack exchange,提问作者Steven Jung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:18:19