我正在尝试为一个项目创建一个可执行的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 库文件夹的路径?
本机资源(您尝试使用 loadLibrary 加载的资源(需要是FILES,MyClass.class.getResource
返回的资源是 URL;故意,因为它们不需要是文件。事实上,它们通常不是,就像这里的情况一样:你的资源不是文件。它是 jar 文件中的 zip 条目,不是文件。
这是没有办法的;操作系统限制。
我知道 我知道。吸。但是你必须这样做:将DLL解压缩到一个临时位置(你可以这样做;改用getResourceAsStream
,并使用新的Files
API将其复制到文件中;现在它是一个单行(Files.write
(,然后加载它。
当然,将可执行代码写入临时目录然后执行它非常安全敏感;对于这一困境,我没有解决办法。