[英]How to sign an executable created with launch4j using sign4j?
[英]How to get the path to the executable when using launch4j?
我正在使用 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 的运行时完整文件路径)映射到系统属性。 所有变量引用都必须用百分号包围并引用。
设置-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 选项列表中。 这就是我在我的项目中所做的。
配置中的选项之一是允许将目录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)。 至少这对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.