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

时间:2020-01-07 22:05:30

标签: 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-dependencies.jar!/path/to/java_library_name
在创建jar之后以及在运行时,如何才能以编程方式检索包含java库文件夹的路径?

1 个答案:

答案 0 :(得分:3)

本机资源(您尝试通过loadLibrary加载的本机资源)必须是 FILES ,而color1 返回的资源是URL;故意这样做,因为它们不必是文件。实际上,它们通常不是,例如此处所示:您的资源不是文件。这是jar文件(不是文件)中的一个zip条目。

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

我知道,我知道。糟透了但是您必须这样做:将DLL解压缩到一个临时位置(您可以执行此操作;改为使用UIColor(displayP3Red: 2/255.0, green: 2/255.0, blue: 2/255.0, alpha: 1) ,然后使用新的MyClass.class.getResource API将其复制到文件中;如今,这是一种单一的方法(getResourceAsStream),然后加载它。

当然,将可执行代码写入临时目录,然后执行它对安全性非常敏感。我没有解决这个难题的方法。

相关问题