2012-03-09 6 views
1

maven-narプラグインを使用してビルドおよびパッケージ化されたネイティブ共有ライブラリがあります。これはうまく動作し、Linux/MacOSX/Windows上に構築されます。また、共有ライブラリをラップする、maven-narを使って構築されたJNIライブラリも定義しました。どちらもNAR成果物として生成され、使用するにはmaven-narプラグインが必要です。WebアプリケーションでネイティブのMavenアーティファクト(nar)を使用する

NARパッケージ化されていないプロジェクトからこれらのNARに依存関係を宣言するときに問題が発生します。 maven-narプラグインが呼び出されることはありません。私がプロジェクトのパッケージをNARに変更したときだけ、maven-narプラグインが起動します。これは、NARパッケージが感染する必要があるように見えます.NAR依存関係が存在する場合、すべての上流プロジェクトをNARパッケージ化する必要があります。これは正しいのですか、何か不足していますか?

maven-narプラグインを使用して生成されたネイティブ共有ライブラリおよびJNI成果物を、WARなどのWebアプリケーションで正常に使用できますか?それらがWARで使用され展開されていれば、どうやって行えますか?それ以外の場合は、アプリケーションサーバー上のjava.library.path内のある場所にネイティブライブラリを手動で配置する唯一のオプションですか?少なくとも

<?xml version="1.0" encoding="UTF-8"?> 
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>thegroup</groupId> 
    <artifactId>theparent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <relativePath>../pom.xml</relativePath> 
    </parent> 

    <artifactId>thedependant</artifactId> 
    <packaging>jar</packaging> 
    <name>A nice name</name> 

    ... 

    <properties> 
    <skipTests>true</skipTests> 
    </properties> 

    ... 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-nar-plugin</artifactId> 
     <version>2.1-SNAPSHOT</version> 
     </plugin> 
    </plugins> 
    </build> 

    ... 

    <dependencies> 
    <dependency> 
     <groupId>thegoup</groupId> 
     <artifactId>theJNI</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>nar</type> 
    </dependency> 
    </dependencies> 

    ... 

</project> 
+0

関連するポッドスニペットを投稿できますか?ネイティブライブラリを 'war'型プロジェクトの依存として宣言することが可能でなければなりません – Raghuram

答えて

0

ない、または、ない簡単:

はここでNAR JNIアーティファクトに依存プロジェクトのPOMの抜粋です。

JNIをお持ちの場合は、-Djava.library.pathとおそらくLD_LIBRARY_PATH/DYLD_LIBRARY_PATH/PATHを混乱させる必要があります。また、すべてのコンテナの起動時に発生する必要があります。戦争の中からすべてのものをコンテナに伝播する仕組みはありません。

本格的なJava EEでは、JCAモデルはネイティブコードがWebアプリケーションに統合される方法を意図していました。しかし、典型的な軽量コンテナはそれをサポートしていません。

ネイティブコードが他の共有ライブラリに依存していない場合や、JVMネイティブコードの競合が心配されていない場合(特定のネイティブクラスは1つのクラスローダーにしか存在しません)オブジェクトをwarファイルに入れます。

http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html

一つのアプローチです。 maven-dependency-pluginを使用して、$ {project.build.directory}の下のディレクトリに共有ライブラリをドロップし、それらを 'Webリソース'として選択します。

+0

プラットフォーム固有の共有ライブラリを一時ファイルに展開し、何らかのカスタムローダを使ってロードする方法がありますか?ネイティブライブラリの抽出とロードに必要な依存関係を再帰的に実行します。 – JerryF

+0

それは問題を解決しません。あなたの大きな問題は、Tomcatなどが最初に起動したときにjvmコマンドラインオプションを変更することです。 – bmargulies

+0

ライブラリをロードするためにSystem.loadLibrary()を使用した場合にのみそうではありませんか?代わりにSystem.load()を使用して、一時ファイルへのパスを提供し、環境とjava.library.pathを混乱させないようにすることができます。 – JerryF

関連する問題