【问题标题】:Apache Tomcat Service Doesn't Recognize JAVA_HOME when installed NSIS - PowerShell Script安装 NSIS 时 Apache Tomcat 服务无法识别 JAVA_HOME - PowerShell 脚本
【发布时间】:2022-08-15 15:33:40
【问题描述】:

我正在为需要 Apache Tomcat 8 作为 Windows 服务的程序制作 NSIS 安装程序。 JAVA_HOME 在 NSIS 安装程序脚本中设置为环境变量,我已经制作了 Powershell 脚本文件来处理 Tomcat 特定变量(CATALINA_HOME, JvmMX, JvmArgs)并最终运行service.bat install

当我独立运行以下 Powershell 脚本时(设置了 JAVA_HOME 环境变量)service.bat install 安装 Tomcat 服务,找到正确的JAVA_HOME 路径。但是,当它通过安装程序完成时,如下图所示,它会为 JAVA_HOMEJRE_HOME. 获得一个空路径

我是靠psExec.nsh插件执行Powershell脚本(${PowerShellExecFileLog})

我似乎无法找到发生这种情况的原因.. 任何帮助将不胜感激! 我唯一的猜测是它与 32 位/64 位有关。我确信我错了,所以请纠正我,但我的想法是:系统是 64 位,JAVA_HOME 环境变量是 64 位,但安装程序是 32 位,使 Powershell它的调用是 32 位的,因此 Powershell 无法检索 64 位环境变量。

以下是相关代码sn-ps:

[PowerShell Script -- Tomcat-Setup.ps1]

$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
[NSIS Script]

Section \"MainSection\" SEC02  
  InitPluginsDir
  ${PowerShellExecFileLog} \"$INSTDIR\\Tomcat-Setup.ps1\"
SectionEnd

  • 你是如何在 NSIS 中设置 JAVA_HOME 的?
  • @Anders 我直接在 Windows 注册表中写入 JAVA_HOME 值。确切的行如下:${registry::Write} \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\" \"JAVA_HOME\" \"$INSTDIR\\amazon_jdk\\jdk11.0.12_7\" \"REG_EXPAND_SZ\" $R0

标签: java powershell tomcat nsis


【解决方案1】:

写入注册表不会影响安装程序和您可能启动的任何子进程,您还应该更新安装程序进程本身:

!include "winmessages.nsh"
${registry::Write} ...
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
System::Call 'KERNEL32::SetEnvironmentVariable(t "JAVA_HOME", ts)' "$INSTDIR\amazon_jdk\jdk11.0.12_7" ; Update this process
...
; Start Powershell script...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 2015-05-26
    • 2019-02-23
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多