Maven 2 在Maven中使用本机依赖项
POM依赖项包含本机库(JAR文件中的DLL)。如何以编程方式查找下载的JAR文件的路径,以便将其传递到“java.library.path”您可以使用maven依赖插件将工件复制到预定义的路径:Maven 2 在Maven中使用本机依赖项,maven-2,dependencies,Maven 2,Dependencies,POM依赖项包含本机库(JAR文件中的DLL)。如何以编程方式查找下载的JAR文件的路径,以便将其传递到“java.library.path”您可以使用maven依赖插件将工件复制到预定义的路径: 如果DLL在JAR中,则需要将其复制到一个目录中,然后才能加载。(包含本机库的JAR通常自己执行此操作。)如果您的JAR不执行此操作,则可以使用Class.getResourceAsStream()并将其写入已添加到java.library.path的目录 有关这方面的示例,请参见JNA中的。它使用这
如果DLL在JAR中,则需要将其复制到一个目录中,然后才能加载。(包含本机库的JAR通常自己执行此操作。)如果您的JAR不执行此操作,则可以使用Class.getResourceAsStream()并将其写入已添加到
java.library.path
的目录
有关这方面的示例,请参见JNA中的。它使用这种技术从JAR中加载自己的库(JNI库)。由于System.load()
无法从JAR中加载库,因此必须使用自定义加载程序,在运行时将库提取到临时文件中。讨论此方法并提供自定义加载程序的代码
库加载器
现在,我们的JNI库位于
类路径,所以我们需要一种
加载它。我创建了一个单独的
将提取JNI的项目
从类路径创建库,然后
加载它们。在找到它
.
这将作为依赖项添加到
很明显,是波姆
要使用它,请致电
com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)
。
更多信息请参见
NativeLoader
我通常喜欢把这些东西包起来
在try/catch块中,如下所示:
public class Sqrt {
static {
try {
NativeLoader.loadLibrary("sqrt");
} catch (Throwable e) {
e.printStackTrace();
System.exit(1);
}
}
/* ... class body ... */
}
另一种方法是解包依赖项,例如使用。回答我自己的问题: 简而言之,您可以使用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>
org.apache.maven.plugins
maven依赖插件
打开
编译
打开
org.jdesktop
jdic本机
${jdic.version}
${build.type}
罐子
真的
${project.build.directory}/lib
很好,但是如何在Maven中实现这一点(而不是在我的应用程序代码中进行引导)?我建议不要在Maven中实现这一点。如果JAR没有做到这一点,那么创建一个简单的辅助JAR来进行解包——如果您的代码首先加载本机库,那么当库JAR尝试加载同一个库时就会找到它。maven中最接近的东西是依赖插件,它可以将依赖项解压到目录中。本机库将在解包目录中。@ksclarke,已修复。谢谢你的提醒。如果你觉得这个答案有用,请投赞成票。