【发布时间】:2010-06-17 17:32:56
【问题描述】:
POM 依赖项包含本地库(JAR 文件中的 DLL)。如何以编程方式查找下载的 JAR 文件的路径,以便将其传递到“java.library.path”?
【问题讨论】:
标签: maven-2 dependencies
POM 依赖项包含本地库(JAR 文件中的 DLL)。如何以编程方式查找下载的 JAR 文件的路径,以便将其传递到“java.library.path”?
【问题讨论】:
标签: maven-2 dependencies
回答我自己的问题:http://web.archive.org/web/20120308042202/http://www.buildanddeploy.com/node/17
简而言之,您可以使用 maven-dependency-plugin:unpack 目标将库提取到已知路径中,并将其传递给 java.library.path:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>compile</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.jdesktop</groupId>
<artifactId>jdic-native</artifactId>
<version>${jdic.version}</version>
<classifier>${build.type}</classifier>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
【讨论】:
由于System.load() 无法从 jar 中加载库,您必须使用自定义加载器在运行时将库提取到临时文件中。 Projects With JNI 讨论此方法并为自定义加载程序提供代码。
库加载器
现在我们的 JNI 库位于 类路径,所以我们需要一种方法 加载它。我创建了一个单独的 将提取 JNI 的项目 类路径中的库,然后 加载它们。找到它 http://opensource.mxtelecom.com/maven/repo/com/wapmx/native/mx-native-loader/1.2/。 这是作为依赖项添加到 pom,很明显。
要使用它,请致电
com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)。 更多信息在 javadoc 中NativeLoader.我通常更喜欢包装这样的东西 在 try/catch 块中,如下所示:
public class Sqrt { static { try { NativeLoader.loadLibrary("sqrt"); } catch (Throwable e) { e.printStackTrace(); System.exit(1); } } /* ... class body ... */ }
另一种方法是解压缩依赖项,例如使用dependency:unpack。
【讨论】:
您可以使用 maven 依赖插件将工件复制到预定义的路径:
http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html
【讨论】:
如果 DLL 在 JAR 中,则需要先将其复制到目录中,然后才能加载它。 (包含本机库的 JAR 通常会自己执行此操作。)如果您的 JAR 没有执行此操作,那么您可以使用 Class.getResourceAsStream() 并将其写入您已添加到 java.library.path 的目录中。
有关这方面的示例,请参阅 JNA 中的 loadNativeLibrary。它使用这种技术从 JAR 加载它自己的库(JNI 库)。
【讨论】: