JNIとMavenを扱う場合、ProjectsWithJNIが最初のリファレンスです。それはあなたの現在の問題(JNIとネイティブライブラリに依存するライブラリを「ただ」使用すること)よりもはるかに多くをカバーしますが、まあ、より多くのことができる人はより少ないことをすることができます。
注意深く読むと、JNIライブラリを使用する1つの解決策は、アーキテクチャ固有のJARにバンドルして、Mavenの観点から他の依存関係と同じように依存できるようにすることです。これは、実際にはJOGLバージョン1.1.1が http://download.java.net/maven/2/net/java/dev/jogl/にパッケージ化されている方法です。Javaクラスを含む1つのJARアーティファクトと、いくつかのアーキテクチャ固有のJARアーティファクトがあります。ネイティブライブラリを使用します。
jar内にアーカイブされたJNIライブラリ
私が使用することになった解決策は、コンパイルされたjniライブラリをクラスファイルと一緒にjarに保存することでした。
これは、考えられるすべてのアーキテクチャーに対してクロスコンパイルするか、より単純に、アーキテクチャーごとに異なるjarを使用することを意味します。この後者は、私たちのセットアップに非常によく適合します。ほとんどすべてのマシンがLinux-i386であり、win32ボックスがわずかにあります。
残念ながらSystem.load()
、jar内からのライブラリのロードには対応できないため、実行時にライブラリを一時ファイルに抽出するカスタムローダーが必要になります。ただし、これは明らかに達成可能です。
次に、説明したように、カスタムライブラリローダーを使用してネイティブライブラリをロードするという考え方です。良いニュースは、そのようなローダーが以下に説明するように「提供」されていることです。
ライブラリローダー
これでクラスパスに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 ... */
}
これで、junitテストがMavenから機能するようになります。mvnテストが機能するはずです!IDEからも正常に動作するはずです。
さて、あなたの質問に答えるために、どのように:
必要に応じて、ここからOS固有のJOGL zipファイルを自動的にダウンロードします(4つのjarファイルといくつかのネイティブライブラリファイル(.so / .dll)が含まれています)。または、ファイルの1つのラッパーであるMavenプロジェクトに依存します。
残念ながら、JOGL 2.0 jarはjava.netのMavenリポジトリでは利用できないため、これに対処してプライベートリポジトリで利用できるようにするか、各開発者のローカルリポジトリに手動でインストールする必要があります。これを行うには、サードパーティのJARをインストールするmvn install:install-file
ためのガイドに記載されているように使用します(この目標は、リモートリポジトリにアーティファクトをインストールするために使用されます)。mvn deploy:deploy-file
個人的には、指定したURLからJOGL 2.0 ZIPをダウンロードし、JOGL 1.1.1(1つのJava JARとネイティブライブラリ用のいくつかの特定のJAR)と同じようにパッケージ化し、今のところ各ローカルリポジトリにJARをインストールします。次に、Javaアーティファクトへの標準的な依存関係を宣言し、実際、アーキテクチャ固有の依存関係のプロファイルを使用します。このようなもの:
<project>
...
<dependencies>
<dependency>
<groupId>net.java.dev.jogl</groupId>
<artifactId>jogl</artifactId>
<version>2.0-beta10</version>
</dependency>
...
</dependencies>
...
<profiles>
<profile>
<id>linux-i586</id>
<activation>
<os>
<arch>i386</arch>
<family>unix</family>
<name>linux</name>
</os>
</activation>
<dependencies>
<dependency>
<groupId>net.java.dev.jogl.jogl-linux-i586</groupId>
<artifactId>jogl-linux-i586</artifactId>
<version>2.0-beta10</version>
</dependency>
</dependencies>
</profile>
...
</profiles>
...
</project>
カスタムライブラリローダーと依存関係に必要なリポジトリを追加することを忘れないでください。
<project>
<repositories>
<repository>
<id>opensource.mxtelecom.com</id>
<url>http://opensource.mxtelecom.com/maven/repo</url>
</repository>
...
<repositories>
...
<dependencies>
<dependency>
<groupId>com.wapmx.native</groupId>
<artifactId>mx-native-loader</artifactId>
<version>1.2</version>
</dependency>
...
</dependencies>
...
</project>
あなたの質問の2番目の部分について:
そのzipファイルを適切に解凍して、(...)
私が説明したように、実際にはZIPファイルではなくJARに依存し、開発中もプロジェクトの配布中にもそれらを解凍する必要はありません。配布の場合は、依存関係を含むjarを作成する必要があります。これは、maven-assembly-pluginを使用して実行できます。詳細については、たとえばこの回答を参照してください。