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
相关产品推荐
相关产品推荐

