28

過去数日間、空き時間にMavenを勉強してきましたが、JOGLライブラリを使用するようにプロジェクトを編成する方法がわからないようです。私はできれば次のことを望みます:

  1. 必要に応じて、ここからOS固有のJOGL zipファイルを自動的にダウンロードします(4つのjarファイルといくつかのネイティブライブラリファイル(.so / .dll)が含まれています)。または、ファイルの1つのラッパーであるMavenプロジェクトに依存します。
  2. そのzipファイルを適切に解凍して、次のようにします。
    1. jarファイルはクラスパスに追加され、必要に応じてデプロイされます。
    2. ネイティブライブラリファイルが最終的なjarファイルに追加されます(これにより、それらを自動的に使用できるようになりますか、それとももっと複雑なものが必要になりますか?)

私の問題の一部は、JOGLの使用法、コードを実行するときにネイティブライブラリを配置する場所などを完全に理解していないことだと思います。基本に戻ってJOGL hello worldを記述し、からコンパイルする必要があります。コマンドラインを実行し、コマンドラインから実行して、ネイティブライブラリのディレクトリ配置に関して必要なものを正確に確認します。実は今すぐに行くかもしれません。

項目1で、OS固有の機能をいくつか見つけました。Mavenプロファイルは、オペレーティングシステムを含むシステムのプロパティに基づいてアクティブ化できます。したがって、Linuxの場合と同じWindows固有のJOGLライブラリに依存し、両方とも64ビットの分身を持つWindowsプロファイルをアクティブ化できます。(アクティベーション公式ドキュメント/非公式ドキュメント。)

JOGL jarファイルに基づいてMavenリポジトリーを作成し、プロジェクトの依存関係としてJOGLjarファイルプロジェクトを追加しようとしました。依存関係はダウンロードされますが、使用されません。jarファイルの場所や使用方法、解凍方法などがわかりません。使用したコマンドは次のとおりです。

つまり、要するに、JOGLは4つの.jarファイルといくつかのネイティブライブラリで構成されています。これらのファイルをMavenプロジェクトに統合して、ビルドプロセスを処理するMavenでJOGLアプリケーションを作成するにはどうすればよいですか?さらに、ネイティブライブラリや.jarファイルでさえWindows、Linux、Macで異なるため、オペレーティングシステムに応じて異なるファイルセットを使用するにはどうすればよいですか。

4

7 に答える 7

25

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を使用して実行できます。詳細については、たとえばこの回答を参照してください。

于 2009-12-28T11:37:07.940 に答える
15

Jogampには、joglコンポーネントのMavenのサポートが含まれるようになりました(joclおよびjoalのサポートは近日公開予定です)。2.0-rc11以降、パッケージはMavenCentralにプッシュされます。

これをあなたのpomに置いてください:

 <dependencies>
   <dependency>
     <groupId>org.jogamp.gluegen</groupId>
     <artifactId>gluegen-rt-main</artifactId>
     <version>2.0-rc11</version>
   </dependency>
   <dependency>
     <groupId>org.jogamp.jogl</groupId>
     <artifactId>jogl-all-main</artifactId>
     <version>2.0-rc11</version>
   </dependency>
 </dependencies>

Mavenは、次にプロジェクトをビルドしようとしたときに、すべての依存関係をプルします。

ウィキでもっと読む

于 2012-11-24T10:03:20.337 に答える
6

ここにJOGL2.0のMavenリポジトリがあります:http://jogamp.org/deployment/maven/

プロジェクトの構築にはSBTを使用しています。追加する必要のあるリゾルバーbuild.sbt

resolvers += MavenRepository("jogamp", "http://jogamp.org/deployment/maven")

そして、依存関係、例えば、ベースjoglライブラリの場合:

libraryDependencies += "org.jogamp.jogl" % "jogl-all" % "2.0-rc9"

Maven xmlファイルでは、これは次のようになります(これによると

 <settings>
   <profiles>
     <profile>
       <id>jogamp</id>
       <activation>
         <activeByDefault>true</activeByDefault> 
       </activation>
       <repositories>
         <repository>
           <id>jogamp-remote</id>
           <name>jogamp test mirror</name>
           <url>http://www.jogamp.org/deployment/maven/</url>
           <layout>default</layout>
         </repository>
       </repositories>
     </profile>
   </profiles>
 </settings>

依存関係が次のように宣言されている場合:

<dependency>
  <groupId>org.jogamp.jogl</groupId>
  <artifactId>jogl-all</artifactId>
  <version>2.0-rc9</version>
</dependency>

適切なネイティブjarを自動的にダウンロードするには、sbtで次のようにします。

sys.props("os.name") match {
  case "Linux" => "org.jogamp.jogl" % "jogl-all-natives-linux-i586" % "2.0-rc9"
  ... etc. ...
于 2012-07-03T18:57:24.593 に答える
5

JOGLライブラリはわかりませんが、同じインストール/ビルドの問題があるJava3dの経験があります。これを実現するには、次の2つの方法があります。

  • 開発者に、支援なしでJOGLをインストールし、Java3dの場合と同様にJOGLライブラリをシステム依存関係として扱うように指示します。

    <dependency>
        <groupId>javax.java3d</groupId>
        <artifactId>j3dcore</artifactId>
        <version>1.5.1</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/ext/j3dcore.jar</systemPath>
    </dependency>
    
  • すべてのjarとシステム依存ライブラリを独自のリポジトリに配置し、それらに適したpomを作成します

JOGLのMavenインストールで自動化することを強く希望する場合は、maven-antrun-pluginを使用するか、インストールを処理する独自のMavenプラグインを作成してみてください(サーバーをダウンロードして解凍するCargoが良い例です)。

最初のオプションを使用することを検討します-開発者にJOGLをインストールするように指示します。この場合、Java3dアプリケーションはJava WebStartによって配布されるため、Java3dのインストールはWebStartによって完全に自動化されます。

于 2009-12-28T07:45:18.810 に答える
2

ここで、参考のために、JOGLライブラリ(2.0ベータ10)をダウンロードして解凍するAntbuild.xmlファイルの一部です。

<target name="libraries" depends="libraries.jogl" />

<target name="libraries.jogl.check">
    <condition property="libraries.jogl.exists">
        <available file="lib/jogl" />
    </condition>
</target>

<target name="libraries.jogl" depends="libraries.jogl.check" unless="libraries.jogl.exists">
    <condition property="joglostype" value="windows-i586">
        <and>
            <os family="windows" />
            <or>
                <os arch="i386" />
                <os arch="x86" />
            </or>
        </and>
    </condition>
    <condition property="joglostype" value="windows-amd64">
        <and>
            <os family="windows" />
            <os arch="amd64" />
        </and>
    </condition>
    <condition property="joglostype" value="linux-i586">
        <and>
            <os name="Linux" />
            <or>
                <os arch="i386" />
                <os arch="x86" />
            </or>
        </and>
    </condition>
    <condition property="joglostype" value="linux-amd64">
        <and>
            <os name="Linux" />
            <or>
                <os arch="AMD64" />
                <os arch="x86_64" />
            </or>
        </and>
    </condition>
    <echo>Detected operating system: ${joglostype}</echo>
    <echo>(if invalid OS, update ant build file)</echo>

    <mkdir dir="lib" />
    <get src="http://download.java.net/media/jogl/builds/archive/jsr-231-2.0-beta10/jogl-2.0-${joglostype}.zip" dest="lib/jogl.zip" usetimestamp="true" />

    <mkdir dir="lib/jogl" />
    <unzip src="lib/jogl.zip" dest="lib/jogl">
        <patternset>
            <include name="**/gluegen-rt.jar" />
            <include name="**/jogl.all.jar" />
            <include name="**/nativewindow.all.jar" />
            <include name="**/newt.all.jar" />
            <include name="**/*.so" />
            <include name="**/*.dll" />
        </patternset>
        <mapper type="flatten" />
    </unzip>
</target>
于 2010-02-23T03:32:07.597 に答える
1

このスクリプトは、URLからリリースをダウンロードし、ローカル(名前付き)リポジトリにインストールします。 https://gist.github.com/1624599

使用例:./install_jogl_maven http://jogamp.org/deployment/v2.0-rc5 path_to_local_repo 2.0-rc5

于 2012-01-17T04:13:55.123 に答える
0

でこれを達成する簡単な方法はありません。実行可能jarをビルドし、コードとともに正しいファイルをパッケージ化するようにmaven-assembly-pluginを構成できるかどうか試してください。ZIP自体ではなくZIPコンテンツが必要なため、Maven依存関係管理を使用してこれを実現することはできません。maven-ant-pluginを試すことができます。

于 2009-12-27T20:16:54.663 に答える