Использование нативных зависимостей внутри Maven - PullRequest
3 голосов
/ 17 июня 2010

Зависимость POM содержит собственные библиотеки (библиотеки DLL внутри файла JAR). Как программно найти путь к загруженному файлу JAR, чтобы я мог передать его в «java.library.path»?

Ответы [ 4 ]

12 голосов
/ 17 июня 2010

Отвечая на мой вопрос: http://web.archive.org/web/20120308042202/http://www.buildanddeploy.com/node/17

Короче говоря, вы можете использовать maven-dependency-plugin: unpack target для извлечения библиотек по известному пути и передачи его в 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>
2 голосов
/ 17 июня 2010

Поскольку System.load() не может загружать библиотеки из jar-файла, вам придется использовать специальный загрузчик, который извлекает библиотеку во временный файл во время выполнения. Проекты с JNI обсуждают этот подход и предоставляют код для пользовательского загрузчика.

Библиотека загрузчика

Теперь у нас есть библиотека JNI на путь к классу, поэтому нам нужен способ загружаю это. Я создал отдельный проект, который извлек бы JNI библиотеки из пути к классам, затем загрузить их. Найдите это в http://opensource.mxtelecom.com/maven/repo/com/wapmx/native/mx-native-loader/1.2/. Это добавляется как зависимость к Пом, очевидно.

Чтобы использовать это, позвоните 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.

0 голосов
/ 17 июня 2010

Если DLL находится внутри JAR, вам нужно будет скопировать ее в каталог, прежде чем он сможет быть загружен.(JAR, которые включают нативные библиотеки, обычно делают это сами.) Если ваш JAR не делает этого, вы можете использовать Class.getResourceAsStream () и записать это в каталог, который вы добавили в java.library.path.

Пример этого см. В loadNativeLibrary в JNA.Он использует эту технику для загрузки своей собственной библиотеки (библиотеки JNI) из JAR.

0 голосов
/ 17 июня 2010

Вы можете использовать плагин зависимостей maven, чтобы скопировать артефакты в предопределенный путь:

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

...