【问题标题】:Using native dependencies inside Maven在 Maven 中使用本机依赖项
【发布时间】:2010-06-17 17:32:56
【问题描述】:

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

【问题讨论】:

    标签: maven-2 dependencies


    【解决方案1】:

    回答我自己的问题: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>
    

    【讨论】:

    • @ksclarke,已修复。谢谢你的头。如果您觉得这个答案有用,请投票赞成。
    【解决方案2】:

    由于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

    【讨论】:

      【解决方案3】:

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

      http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html

      【讨论】:

        【解决方案4】:

        如果 DLL 在 JAR 中,则需要先将其复制到目录中,然后才能加载它。 (包含本机库的 JAR 通常会自己执行此操作。)如果您的 JAR 没有执行此操作,那么您可以使用 Class.getResourceAsStream() 并将其写入您已添加到 java.library.path 的目录中。

        有关这方面的示例,请参阅 JNA 中的 loadNativeLibrary。它使用这种技术从 JAR 加载它自己的库(JNI 库)。

        【讨论】:

        • 很好,但是我如何在 Maven 中执行此操作(而不是必须在我的应用程序代码中引导)?
        • 我建议不要在 Maven 中这样做。如果 JAR 没有立即执行此操作,则创建一个简单的伴随 JAR 来进行解包 - 如果您的代码首先加载本机库,则在库 JAR 尝试加载相同的库时会找到它。 maven 中最接近的东西是依赖插件,它可以将依赖解包到目录。本机库将在解压后的目录中。
        猜你喜欢
        • 2021-04-07
        • 1970-01-01
        • 2013-04-23
        • 2011-06-24
        • 1970-01-01
        • 2017-11-29
        • 2015-01-06
        • 2013-11-17
        • 2023-02-07
        相关资源
        最近更新 更多