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

标签 java maven build jar java.library.path

我正在尝试为一个项目创建一个可执行的 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/

相关文章:

java - 如何模拟onLongClick?

java - 如何在 Java 中执行 shell 命令?

java - 在 javascript 中运行 java

java - cxf-xjc 插件 "Must specify xsdOptions"错误

visual-studio - 名称 'Sitecore' 在当前上下文中不存在

android - Cordova 错误 : Failed to find 'ANDROID_HOME' environment variable

azure - 在 Azure DevOps Server 上创建构建 zip,例如 github

java - 列表和数组的区别

java - mvn eclipse :eclipse not working

maven - 安装primefaces所有主题后,“artifactory”服务器上缺少jar