Maven 2 在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中的。它使用这

POM依赖项包含本机库(JAR文件中的DLL)。如何以编程方式查找下载的JAR文件的路径,以便将其传递到“java.library.path”

您可以使用maven依赖插件将工件复制到预定义的路径:


如果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,已修复。谢谢你的提醒。如果你觉得这个答案有用,请投赞成票。