使用launch4j时如何获取可执行文件的路径?

我正在使用launch4j在我的Windows应用程序中包装一个可执行jar文件,但是我需要通过JVM参数传递对它的一些库的引用。 有问题的库驻留在应用程序安装目录中,并且始终位于相对于可执行文件的相同位置。

我想告诉launch4j在JVM选项中使用可执行相对路径。 我知道这些信息可以在Windows批处理脚本级别获得,但是如何配置launch4j来获取它?

编辑以澄清:我正在寻找如何使路径相对于二进制本身, 而不是如何使它们相对于当前工作目录。 两者不一定相同。

您可以添加到launch4j配置中

 ...  ... -Djna.library.path="%EXEDIR%\\path\\to\\lib" -Djava.library.path="%EXEDIR%\\path\\to\\lib" ...  ... 

如果你需要更多,那么你可以像往常一样用semikolon分隔几条路径。

可选,接受您通常传递给java / javaw启动程序的所有内容:断言选项,系统属性和X选项。 在这里,您可以将环境和特殊变量EXEDIR(exe的运行时目录),EXEFILE(exe的运行时完整文件路径)映射到系统属性。 所有变量引用必须用百分号和引号括起来。

资料来源: http : //launch4j.sourceforge.net/docs.html

设置-Djna.library.path= (如果使用JNA)和-Djava.library.path=

或者,这可以在Java代码中完成: System.setProperty("jna.library.path","")System.setProperty("java.library.path","") 。 您可以追加多个路径来引用。 在Windows中,使用; 分开路径。

此设置仅对该Java应用程序的JVM运行时有影响(不像Linux中的LD_LIBRARY_PATH那样全局)。

或者,您可以将它放在JRE选项卡下的Launch4J JVM选项列表中。 这就是我在项目中所做的。

配置中的一个选项是允许chdir到可执行文件目录。 这将把user.dir服务到与exe相同的目录,您可以使用它来查找其他应用程序路径。

  

可选的。 将当前目录更改为相对于可执行文件的任意路径。 如果省略此属性或将其留空,则无效。

将其设置为。 将当前目录更改为与可执行文件相同的目录。 ..将它更改为父目录,依此类推。

 . ../somedir 

找到可执行文件的实际路径的代码将依赖于OS(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 

可以解析此String。 但事实上,我认为应该有一个更好的解决方案来解决这个问题。

您只需在Launch4j的类路径选项卡中包含库所在的目录(例如.. \ lib)。 至少那对我有用。