2012-04-09 10 views
13

共有オブジェクト(.so)ファイルを含むJNIライブラリをMavenを使用してプロジェクトに追加したいとします。残念ながらまだパブリックリポジトリにはないので、ローカルリポジトリに自分自身でインストールしなければならないと思います。ローカルMavenリポジトリにJNIライブラリを追加する

Mavenのネイティブ部分をプロジェクトにバンドルするにはどうしたらいいですか(そして最終的にコピー依存関係のプラグインでエクスポートされます)。これは、パッケージ化された.jarを持つ標準のJ2SEアプリケーションです(Webアプリケーションではありません)。

追加しようとしているライブラリは、わかっている場合に備えて、junixsocketです。 .so(ネイティブライブラリ)コンポーネントとJava .jarコンポーネントがあります。

ネイティブビルドをターゲットにしているようですが、サードパーティ製のJNIライブラリをバンドルするのではなく、コードからJNIプロジェクトを作成する方がより重視されています。ジグソーパズルを一緒に作れません。 .soのライブラリに依存するの.jarを持つ、私のローカルリポジトリでこれらをインストール

  1. はどのようにして行くのです。

  2. POMファイルの依存関係(.jarと.so)を含む。

ありがとうございます。

答えて

5

jarに.soを含め、プラットフォーム固有の共有ライブラリを追加して読み込みます。この方法で、他のjarと同じように配備されます。

これは、異なるプラットフォーム用に複数の.soで、行われているプロジェクトの例は、実行時に、あなたのライブラリを開梱する代わりにATがhttps://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java

+0

は、どのようにそれを展開しますネイティブライブラリが正しいLIBRARY_PATHに配置されていることを確認しますか? – jbx

+0

それは 'java.io.tmpdir'のサブディレクトリにロードされ、フルパス名でロードされます。 –

8

私のアプローチは:sqlite3-3.7.9-linux-x86_64.so

はこのように、プラットフォーム固有の分類器でリポジトリに.soファイルを入れてください。 必要なすべてのプラットフォーム用.so依存関係を追加します。あなたのlib/nativeディレクトリにすべてのネイティブのlibsを置くため

<dependency> 
    <groupId>de.ch-werner</groupId> 
    <artifactId>sqlite-jdbc</artifactId> 
    <version>3.7.9</version> 
    <type>so</type> 
    <classifier>linux-x86_64</classifier> 
</dependency> 

を使用し、このMavenのアセンブリのプラグインの設定は、DIST:

<dependencySet> 
    <outputDirectory>lib/native</outputDirectory> 
    <outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping> 
    <unpack>false</unpack> 
    <useProjectArtifact>false</useProjectArtifact> 
    <useStrictFiltering>false</useStrictFiltering> 
    <includes> 
     <include>*:*:dll:*</include> 
     <include>*:*:so:*</include> 
     <include>*:*:jnilib:*</include> 
    </includes> 
</dependencySet>  

使用this classをアプリ起動時にLIBSをロードするために( )GNU tripletsに命名分類器を変更することを計画:

CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3") 
+0

通常のmvn installコマンドでプラットフォーム固有の分類子を持つ.soを追加することはできますか? – jbx

+0

@jbxおそらく 'mvn deploy'を意味するのでしょうか?私はMaven自身が構築したjava depsのためにのみ使用しました。私たちのJNI depsはmavenなしでビルドされ、単純なbashスクリプトでcURLを使ってmavenリポジトリにロードされます。 – alexkasko

+0

いいえ、私はmvnのインストールを意味しませんでした。私は通常、Mavenリポジトリにないサードパーティのライブラリでこれを行います。 http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html基本的に私がしたいのは、.soをサードパーティ製の瓶に入れることです。 – jbx

関連する問題