2017-07-20 9 views
1

1つのクラスしか利用できない1つのmavenプロジェクトを作成しました。私はこのクラスでjnetpcap APIを使いたいと思っています。この目的のために、私はjnet eclipse setupチュートリアルのセットアップ1アプローチ(ユーザーライブラリ)を実行し、1つのユーザーライブラリを作成してプロジェクトに追加しました。必須のユーザーライブラリを使用してメインクラスを実行する方法は?

JnetTest.java - jnetpcap clasic example

私のシステムは、Ubuntuの16.10であるようこのクラスは同じです。

私はopenjdkバージョン "1.8.0_131"を使用しています。

ライブラリの作成手順 -

  1. 私は1.3バージョンのjarパッケージ、ソースパッケージとjnetpcapのjavadocのパッケージをダウンロードして、コメントを追加しlibjnetpcap.so、jnetpcap.jar、jnetpcap-src-1.3.zip、jnetpcap-javadoc- 1.3.zipからlibフォルダにメインプロジェクトフォルダの下に作成されます。
  2. 新しいライブラリを作成しました。 Java - >ビルドパス - >ユーザーライブラリ - >新規 - >任意の名前を付けます。
  3. jarファイルを追加します。外部jarsの追加 - >ワークスペースラジオボタン - > lib/jnetpcap.jarを選択
  4. 必要な依存関係を満たしています。 jar - > source - > edit - > lib/jnetpcap-src-1.3.zipを展開します。 javadoc - >編集 - >選択されたlib/jnetpcap-javadoc-1.3.zip。ネイティブライブラリの場所 - >編集 - >選択したlibディレクトリ。 - >適用 - > OK
  5. プロジェクトにライブラリを追加します。プロジェクト - >ビルドパス - >ビルドパスの設定 - >ライブラリ - >ライブラリの追加 - >ユーザライブラリ - >新しく作成されたライブラリを右クリックします。

メモ -私はメインクラスにvm引数を追加しませんでした。つまり、-Djava.library.path = ".soファイルの親ディレクトリの場所"

その後、プロジェクトを右クリックし、Javaアプリケーションとして実行をクリックしました。これは、うまくいく形で動作します。

実際の問題 -私は、コマンドラインのみを使用して、別のマシンでこのmavenプロジェクトを実行したいと考えています。コマンドラインを使ってこのプロジェクトをどのように実行できますか?

私のアプローチ -

  1. 私は、メインクラス構成のためのpom.xmlでのプラグインの下に追加。

    <!-- language: lang-xml --> 
    <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>exec-maven-plugin</artifactId> 
        <version>1.2.1</version> 
        <executions> 
        <execution> 
         <goals> 
          <goal>java</goal> 
         </goals> 
        </execution> 
        </executions> 
        <configuration> 
         <mainClass>com.example.Main</mainClass> 
        </configuration> 
    </plugin> 
    
  2. 私は

    mvn exec:java -Dexec.mainClass="com.example.Main" 
    

私のメインクラスを実行するために、MVNのexecコマンドを使用しかし、私は例外の下になった - 私のアプローチは私を実行するために正しいかではありません

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J 
at com.slytechs.library.NativeLibrary.dlopen(Native Method) 
at com.slytechs.library.NativeLibrary.(Unknown Source) 
at com.slytechs.library.JNILibrary.(Unknown Source) 
at com.slytechs.library.JNILibrary.loadLibrary(Unknown Source) 
at com.slytechs.library.JNILibrary.register(Unknown Source) 
at com.slytechs.library.JNILibrary.register(Unknown Source) 
at com.slytechs.library.JNILibrary.register(Unknown Source) 
at org.jnetpcap.Pcap.(Unknown Source) 

プロジェクトのメインクラス?はいの場合、私の問題の解決策は何ですか?いいえ、有用なアプローチを提案してください。

答えて

1

JnetPcapは、プロジェクト内の2つのライブラリを参照する必要があります:

  1. あなたのコード(jnetpcap.jar)
  2. 公開するネイティブライブラリから使用できるJavaインタフェースを含むJARファイルOS固有の機能をJavaライブラリ(libjnetpcap.soまたはjnetpcap.dll)

実行中に#2が欠落していることを示しています時間。

> echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin 

は単純にコピーします。

あなたはどのディレクトリ$PATHシステム変数をエコーでのUbuntu上のパス上にある見つけることができます。この場合、あなたはあなたのアプリケーションのライブラリが利用できるようにする2つのオプションがありますネイティブライブラリをシステムパスに既に含まれているディレクトリにコピーします。

また、Javaの引数java.library.pathを使用してライブラリの場所を渡すこともできます。ライブラリと仮定すると、ディレクトリであなたのMavenプロジェクトディレクトリ内libと呼ばれ、次のコンフィギュレーションを使用します。これを実行するには

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <configuration> 
     <executable>java</executable> 
     <arguments> 
      <argument>-Djava.library.path=${project.basedir}/lib</argument> 
      <argument>-classpath</argument> 
      <classpath /> 
      <argument>com.example.Main</argument> 
     </arguments> 
    </configuration> 
</plugin> 

を、単に実行します。

mvn exec:exec 
+0

@ BenDamer-あなたの答えをありがとう。 jarと依存関係のバージョンの競合のために私の問題。どのような方法であれ、あなたのソリューションは非常に役に立ちます。なぜバージョン1.3.0の依存関係が利用できないのですか?外部からjarファイルを提供する必要があるのはなぜですか? – kit

+0

バージョン1.3.0はかなり古いものですが、1.4.xはMavenリポジトリで利用可能です。あるいは、リポジトリに手動で1.3.0を手動でインストールすることもできます。 –

+0

こんにちは@BenDamer、それはうまくいきます。あなたのように私はmavenを作成しました。今私は、この構造を失うことなく、このプロジェクトにメインクラスをもう1つ追加したいと思います。 – kit

0

私はあなたの正確なコードbuを持っていない私はあなたがこれを探していると思います。マークされた箇所の下

http://www.mojohaus.org/exec-maven-plugin/examples/example-exec-using-plugin-dependencies.html

あなたのメインクラスで必要な依存関係を置くことができるものです。私はこれがうまくいきたい

<project> 
     ... 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.6.0</version> 
      <executions> 
       <execution> 
       ... 
       <goals> 
        <goal>java</goal> 
       </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <includeProjectDependencies>false</includeProjectDependencies> 
       <includePluginDependencies>true</includePluginDependencies> 
       <executableDependency> 
       <groupId>com.example.myproject</groupId> 
       <artifactId>mylib</artifactId> 
       </executableDependency> 
       <mainClass>com.example.Main</mainClass> 
       <arguments> 
       <argument>argument1</argument> 
       ... 
       </arguments> 
       <systemProperties> 
       <systemProperty> 
        <key>myproperty</key> 
        <value>myvalue</value> 
       </systemProperty> 
       ... 
       </systemProperties> 
      </configuration> 
<!-- This is where you put dependencies needed for main class--> 
      <dependencies> 
       <dependency> 
       <groupId>com.example.myproject</groupId> 
       <artifactId>mylib</artifactId> 
       <version>1.3.5</version> 
       <type>jar</type> 
       </dependency> 
      </dependencies> 
      </plugin> 
     </plugins> 
     </build> 
     ... 
    </project> 
+0

をRaviK- @に置く必要があり、どの依存関係タグ?私のプロジェクトには、jnetpcap、group-jnetpcap、version-1.4.r1425-1dという1つの依存関係アーティファクトしかありません。変更が必要なことは、詳細に説明してください。 – kit

+0

依存関係>依存関係セクションでプラグイン内にjnetpcap依存関係を追加できますか? execプラグインを使用してjavaプログラムを実行すると、必要な依存関係をすべてプラグインで提供する方が良いでしょう。情報が限られているため、これは私の計算上の推測です。 –

+0

@ RaviK-はいそれは何の影響もありませんでした。それはlibjnetpcap.soファイルを取得しなかったので、例外を示しています。私は-Djava.library.pathオプションも提供してみました。 – kit

関連する問題