2

maven-nar プラグインを使用してビルドおよびパッケージ化されたネイティブ共有ライブラリがあります。これはうまく機能し、Linux/MacOSX/Windows でビルドされます。また、共有ライブラリをラップする JNI ライブラリも定義しました。これも maven-nar を使用して構築されています。これらは両方とも NAR アーティファクトとして生成され、使用するには maven-nar プラグインが必要です。

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

maven-nar プラグインを使用して生成されたネイティブ共有ライブラリと JNI アーティファクトは、Web アプリケーション (つまり、WAR) で正常に使用できますか? それらをWARで使用および展開できる場合、それはどのように行われますか? それ以外の場合、ネイティブ ライブラリをアプリ サーバーの java.library.path のある場所に手動で配置する唯一のオプションはありますか?

NAR JNI アーティファクトに依存するプロジェクトの POM のスニペットを次に示します。

  <?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>
4

1 に答える 1

0

いいえ、または少なくとも、簡単ではありません。

JNIを使​​用している場合は、-Djava.library.pathとおそらくLD_LIBRARY_PATH / DYLD_LIBRARY_PATH / PATHをいじる必要があります。これらはすべて、コンテナー全体の起動時に発生する必要があります。戦争の中からコンテナにそれらすべてを伝播するためのメカニズムはありません。

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

ネイティブコードが他の共有ライブラリに依存しておらず、JVMネイティブコードの競合を心配していない場合(特定のネイティブクラスは1つのクラスローダーにのみ存在できます)、問題は単に共有オブジェクトを戦争に巻き込むことです。まったくファイル。

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

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

于 2012-03-09T15:13:52.980 に答える