Install4j-安装程序变量的UndefinedVariableException

Install4j-安装程序变量的UndefinedVariableException,install4j,Install4j,我知道出现了一个错误,但当安装程序在Linux环境下运行时(在windows上运行正常),我似乎仍然会遇到这个错误。 我使用的是v6.1.6[build:6459] 我想做的是: 我定义了一个设置变量操作,在该操作中,如果存在$JAVA_HOME路径,则获取该路径,并将其设置为linuxJavaHome变量 稍后-我定义了Run executable或batch file操作,在该操作中,我使用安装程序previouslinuxJavaHome变量获取java版本 我在多个Linux环境中检

我知道出现了一个错误,但当安装程序在Linux环境下运行时(在windows上运行正常),我似乎仍然会遇到这个错误。 我使用的是v6.1.6[build:6459]

我想做的是:

  • 我定义了一个
    设置变量
    操作,在该操作中,如果存在$JAVA_HOME路径,则获取该路径,并将其设置为
    linuxJavaHome
    变量
  • 稍后-我定义了
    Run executable或batch file
    操作,在该操作中,我使用安装程序previous
    linuxJavaHome
    变量获取java版本
  • 我在多个Linux环境中检查了代码,变量的定义与java主路径非常吻合。此外,我还试着调试我的代码,以确保它看起来没有问题

    我唯一的问题是,当我在JENKINS以静默模式(-q)构建和运行安装程序时,我总是会遇到这种未定义的变量异常。我改进了问题点,它发生在第一个
    设置变量屏幕上

    异常stacktrace是:

    com.install4j.api.beans.UndefinedVariableException: installer:linuxJavaHome
    13:03:08 Error log: /home/administrator/installer/install4jError2195873440024941405.log
    13:03:08 com.install4j.api.beans.UndefinedVariableException: installer:linuxJavaHome
    13:03:08    at com.install4j.runtime.installer.InstallerVariables$InstallerReplacementCallback.handleError(InstallerVariables.java:971)
    13:03:08    at com.install4j.runtime.installer.InstallerVariables$InstallerReplacementCallback.getReplacement(InstallerVariables.java:950)
    13:03:08    at com.install4j.runtime.util.StringUtil.replaceVariable(StringUtil.java:68)
    13:03:08    at com.install4j.runtime.installer.InstallerVariables.replaceVariables(InstallerVariables.java:337)
    13:03:08    at com.install4j.runtime.installer.InstallerVariables.replaceVariables(InstallerVariables.java:326)
    13:03:08    at com.install4j.runtime.installer.InstallerVariables.replaceVariables(InstallerVariables.java:322)
    13:03:08    at com.install4j.runtime.installer.InstallerVariables.replaceVariables(InstallerVariables.java:362)
    13:03:08    at com.install4j.api.beans.AbstractBean.replaceVariables(AbstractBean.java:89)
    13:03:08    at com.install4j.runtime.beans.actions.misc.RunExecutableAction.getExecutable(RunExecutableAction.java:58)
    13:03:08    at com.install4j.runtime.beans.actions.misc.RunExecutableAction.execute(RunExecutableAction.java:292)
    13:03:08    at com.install4j.runtime.beans.actions.SystemInstallOrUninstallAction.install(SystemInstallOrUninstallAction.java:29)
    13:03:08    at com.install4j.runtime.installer.ContextImpl$7.executeAction(ContextImpl.java:1668)
    13:03:08    at com.install4j.runtime.installer.ContextImpl$7.fetchValue(ContextImpl.java:1659)
    13:03:08    at com.install4j.runtime.installer.ContextImpl$7.fetchValue(ContextImpl.java:1656)
    13:03:08    at com.install4j.runtime.installer.helper.comm.actions.FetchObjectAction.execute(FetchObjectAction.java:14)
    13:03:08    at com.install4j.runtime.installer.helper.comm.HelperCommunication.executeActionDirect(HelperCommunication.java:274)
    13:03:08    at com.install4j.runtime.installer.helper.comm.HelperCommunication.executeActionInt(HelperCommunication.java:259)
    13:03:08    at com.install4j.runtime.installer.helper.comm.HelperCommunication.executeActionChecked(HelperCommunication.java:187)
    13:03:08    at com.install4j.runtime.installer.helper.comm.HelperCommunication.fetchObjectChecked(HelperCommunication.java:170)
    13:03:08    at com.install4j.runtime.installer.ContextImpl.performActionIntStatic(ContextImpl.java:1656)
    13:03:08    at com.install4j.runtime.installer.InstallerContextImpl.performActionInt(InstallerContextImpl.java:151)
    13:03:08    at com.install4j.runtime.installer.ContextImpl.performAction(ContextImpl.java:1103)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeAction(Controller.java:368)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeActions(Controller.java:334)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeActionGroup(Controller.java:405)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeActions(Controller.java:339)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeActionGroup(Controller.java:405)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.executeActions(Controller.java:339)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.handleCommand(Controller.java:195)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.handleStartup(Controller.java:116)
    13:03:08    at com.install4j.runtime.installer.controller.Controller.start(Controller.java:73)
    13:03:08    at com.install4j.runtime.installer.Installer.runInProcess(Installer.java:59)
    13:03:08    at com.install4j.runtime.installer.Installer.main(Installer.java:46)
    13:03:08    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    13:03:08    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    13:03:08    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    13:03:08    at java.lang.reflect.Method.invoke(Method.java:498)
    13:03:08    at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:65)
    13:03:08    at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:57)
    

    “设置变量”操作可能会设置空变量值,因为未定义环境变量
    JAVA\u HOME
    。您可以选择该操作的“如果值为null,则失败”属性,以便更早地发现此问题。

    最后,对我有效的方法是忽略$JAVA_HOME变量的使用,而使用安装程序内部变量
    ${installer:sys.javaHome}
    这在Linux和Windows上都非常有效。

    您可以发布异常的堆栈跟踪吗?当然可以。我把它贴到了我原来的帖子上,因为我不能把它作为评论(太长)来添加。谢谢,我尝试了这个选项,但是失败了,并显示了错误消息。我不明白为什么。我们所有的Linux机器都有JAVA_HOME变量。也许有另一种获取Linux环境的方法,而不是通过System.getenv?我看不到任何其他方法。调用过程可能不会传递环境变量。是否有任何方法可以通过install4j使用Linux语法,如locate java命令?是的,您可以使用“Run executable”操作来执行它并将输出保存到安装程序变量。但是,该可执行文件也将具有错误的环境变量,因为它们是继承的。如果您通过
    /bin/sh
    执行它,可能会从原始环境变量开始。或者我会看看安装程序的调用,也许有一个选项可以传递所有环境变量,或者您可以指定一个值为JAVA_HOME的参数,您可以在安装程序中使用。再次感谢您的回答。关于你写的第二段-你是说将变量定义为“预定义”变量吗?您认为在这种情况下,它是否有助于以后设置变量?