gpt4 book ai didi

java - 在 jar 文件中设置 java.library.path

转载 作者:行者123 更新时间:2023-12-01 19:31:39 24 4
gpt4 key购买 nike

我正在尝试为一个项目创建一个可执行的 jar 文件,该项目有一个 java 库资源文件夹作为项目本身内的依赖项。我想部署该 jar,而不需要用户单独下载该依赖项。因此,我将该 java 库作为资源添加到我的项目中并构建了它。在项目源代码中,我有以下代码来尝试设置“java.library.path”以包含该资源。

这是我的代码:

URL url = Staple.class.getResource("/path/to/java_library_name");
String stringUrl = url.toString();
System.setProperty( "java.library.path", stringUrl );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

但是,当构建代码并尝试执行 jar 本身时,这不起作用,并且出现以下错误:

no java_library_name in java.library.path: [jar, file, /path/to/project/target/jar_name-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/path/to/java_library_name]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
.....

上面的代码有什么问题吗?看起来整个路径都是错误的,并且组成了类似 /path/to/project/target/jar_name-0.0.1-SNAPSHOT-jar-with-dependency.jar!/path/to/java_library_name
在创建 jar 之后和运行时期间,如何以编程方式检索包含 java 库文件夹的路径?

最佳答案

native 资源(您尝试使用 loadLibrary 加载的资源)需要是 FILES,并且 MyClass.class.getResource 返回的资源是 URL;故意的,因为它们不一定是文件。事实上,它们通常不是,就像这里的情况一样:您的资源不是文件。它是 jar 文件中的 zip 条目,而不是文件。

没有办法解决这个问题;操作系统限制。

我知道,我知道。糟透了。但你必须这样做:将 DLL 解压到一个临时位置(你可以这样做;使用 getResourceAsStream 代替,并使用新的 Files API 将其复制到文件中;它是现在是一行代码(Files.write),然后加载它。

当然,将可执行代码写入临时目录然后执行它是非常安全敏感的;我没有办法解决这个困境。

关于java - 在 jar 文件中设置 java.library.path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com