我正在使用 launch4j 在我的 Windows 应用程序中包装一个可执行的 jar 文件,但我需要通过 JVM 参数传递对它的一些库的引用。有问题的库位于应用程序安装目录中,并且相对于可执行文件始终位于同一位置。
我想告诉launch4j 在JVM 选项中使用可执行相对路径。我知道此信息在 Windows 批处理脚本级别可用,但是如何配置 launch4j 来获取它?
编辑澄清:我正在寻找如何使路径相对于二进制文件本身,而不是如何使它们相对于当前工作目录。两者不一定相同。
您可以添加到您的 launch4j 配置
...
<jre>
...
<opt>-Djna.library.path="%EXEDIR%\\path\\to\\lib"</opt>
<opt>-Djava.library.path="%EXEDIR%\\path\\to\\lib"</opt>
...
</jre>
...
如果您需要更多,则可以像往常一样用分号分隔几条路径。
< opt> 可选,接受您通常传递给 java/javaw 启动器的所有内容:断言选项、系统属性和 X 选项。在这里,您可以将环境和特殊变量 EXEDIR(exe 的运行时目录)、EXEFILE(exe 的运行时完整文件路径)映射到系统属性。所有变量引用必须用百分号括起来并加引号。
来源: http: //launch4j.sourceforge.net/docs.html
设置-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 运行时产生影响(不像LD_LIBRARY_PATH
在 Linux 中那样全局。)
或者,您可以将其放在JRE选项卡下的 Launch4J JVM 选项列表中。这就是我在我的项目中所做的。
配置中的选项之一是允许将目录更改chdir
为可执行文件目录。这会将 user.dir 设置为与 exe 相同的目录,您可以使用它来查找其他应用程序路径。
<chdir>
选修的。将当前目录更改为相对于可执行文件的任意路径。如果您省略此属性或将其留空,它将无效。
将其设置为 . 会将当前目录更改为与可执行文件相同的目录。.. 将其更改为父目录,依此类推。
<chdir>.</chdir>
<chdir>../somedir</chdir>
找到可执行文件的实际路径的代码将取决于操作系统(readlink、GetModuleFileName 等)。确保你真的在目标操作系统上进行测试..
如果我理解您的问题是正确的,那么您的安装目录中有一个 launch4j 可执行文件和一个本机库:
/launch.exe
/bin/lib.dll
/lib/app.jar
现在您想使用生成的启动器 (launch.exe) 启动 app.jar。您的应用程序加载 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
这个字符串可以被解析。但实际上,我认为这个问题应该有更好的解决方案。
您可以简单地在 Launch4j 的类路径选项卡中包含库所在的目录(例如 ..\lib)。至少这对我有用。