我正在使用launch4j在我的Windows应用程序中包装可执行jar文件,但我需要通过JVM参数传递对其某些库的引用。有问题的库驻留在应用程序安装目录中,并且始终位于相对于可执行文件的相同位置。
我想告诉launch4j在JVM选项中使用可执行相对路径。我知道这些信息可以在Windows批处理脚本级别获得,但是如何配置launch4j来获取它?
编辑以澄清:我正在专门研究如何制作相对于二进制文件本身的路径,不如何使它们相对于当前工作目录。两者不一定相同。
答案 0 :(得分:11)
您可以添加到launch4j配置
...
<jre>
...
<opt>-Djna.library.path="%EXEDIR%\\path\\to\\lib"</opt>
<opt>-Djava.library.path="%EXEDIR%\\path\\to\\lib"</opt>
...
</jre>
...
如果你需要更多,那么你可以像往常一样用semikolon隔开几条路径。
&LT;选择&GT;可选,接受您通常传递的所有内容 java / javaw launcher:断言选项,系统属性和X. 选项。在这里您可以映射环境和特殊变量EXEDIR (exe的运行时目录),EXEFILE(exe的运行时完整文件路径)来 系统属性。必须用所有变量引用括起来 百分号和引用。
答案 1 :(得分:3)
设置-Djna.library.path=<relative path of native libraries>
(如果使用JNA)和-Djava.library.path=<relative path of native libraries>
。
或者,这可以在Java代码中完成:System.setProperty("jna.library.path","<relative path of native libraries>")
和System.setProperty("java.library.path","<relative path of native libraries>")
。您可以追加多个路径来引用。在Windows中,使用;
分隔路径。
此设置仅对该Java应用程序的JVM运行时有影响(在Linux中不像LD_LIBRARY_PATH
那样全局。)
或者,您可以将其放在 JRE 选项卡下的Launch4J JVM选项列表中。这就是我在项目中所做的。
答案 2 :(得分:2)
configuration中的一个选项是允许chdir到可执行文件目录。这将把user.dir设置为与exe相同的目录,您可以使用它来查找其他应用程序路径。
<chdir>
可选。将当前目录更改为相对于可执行文件的任意路径。如果省略此属性或将其留空,则无效。
将其设置为。将当前目录更改为与可执行文件相同的目录。 ..将其更改为父目录,依此类推。
<chdir>.</chdir>
<chdir>../somedir</chdir>
找到可执行文件的实际路径的代码将依赖于OS(readlink,GetModuleFileName等)。确保你真的测试目标操作系统..
答案 3 :(得分:1)
如果我理解你的问题是正确的,那么你的安装目录中有一个launch4j可执行文件和一个本机库:
/launch.exe
/bin/lib.dll
/lib/app.jar
现在您要使用生成的启动器(launch.exe)启动app.jar。你的app加载了lib.dll。
您可以将文件嵌入app.jar(marker.txt)。现在您可以使用ClassLoader
http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)
getResource("marker.txt);
这会给你类似的东西:
file://c://installdir/lib/app.jar!marker.txt
可以解析此String。但事实上,我认为应该有一个更好的解决方案来解决这个问题。
答案 4 :(得分:1)
您可以在Launch4j的类路径选项卡中简单地包含库所在的目录(例如.. \ lib)。至少那对我有用。