2017-11-24 14 views
0

私はクライアントとニューラルネットワーク用のサーバーラッパーを作成しています。クライアントは、モデルを実行してその結果をクライアントに返すサーバーにイメージを読み込んで送信します。 私はマルチモジュールプロジェクトを作成しました。 IDE(intellij idea)からクライアントとサーバーを実行すると、すべて正常に動作します。しかし、ビルドにmavenを使用し、端末から実行するとエラーが発生します。Maven MultiModule Projectエラー端末から実行すると

私の主/親のpom.xmlは以下の通りです:

<?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/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>gr.enomix</groupId> 
<artifactId>imageClassificationWrapper</artifactId> 
<packaging>pom</packaging> 
<version>1.0</version> 
<modules> 
    <module>Server</module> 
    <module>Client</module> 
</modules> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

<dependencies> 

    <dependency> 
     <groupId>com.googlecode.json-simple</groupId> 
     <artifactId>json-simple</artifactId> 
     <version>1.1.1</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.0</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.plexus</groupId> 
     <artifactId>plexus-utils</artifactId> 
     <version>2.0.5</version> 
     <scope>compile</scope> 
    </dependency> 

</dependencies> 

</project> 

私のサーバーのpom.xmlがある:

<?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/xsd/maven-4.0.0.xsd"> 
<parent> 
    <artifactId>imageClassificationWrapper</artifactId> 
    <groupId>gr.enomix</groupId> 
    <version>1.0</version> 
</parent> 
<modelVersion>4.0.0</modelVersion> 

<groupId>gr.enomix</groupId> 
<artifactId>Server</artifactId> 
<packaging>jar</packaging> 
<version>1.0</version> 

</project> 

そして、私のクライアントのpom.xmlがある:

<?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/xsd/maven-4.0.0.xsd"> 
<parent> 
    <artifactId>imageClassificationWrapper</artifactId> 
    <groupId>gr.enomix</groupId> 
    <version>1.0</version> 
</parent> 
<modelVersion>4.0.0</modelVersion> 

<groupId>gr.enomix</groupId> 
<artifactId>Client</artifactId> 
<packaging>jar</packaging> 
<version>1.0</version> 

</project> 

親pom.xmlのすべてのライブラリを、子のクライアントとサーバーの両方に継承させます。 その後、私は端末 から実行します。mvnは、 をクリーンインストールし、プロジェクトは正常にビルドされます。

は、最終的に私は、クライアントを実行するために、サーバーと

java -cp target/Client-1.0.jar RunClient 

を実行するために

java -cp target/Server-1.0.jar RunServer 

を実行するが、私は、クライアントとサーバーの両方からエラー

Exception in thread "main" java.lang.NoClassDefFoundError:  org/json/simple/JSONObject 
    at ImageHttpClient.sendImage(ImageHttpClient.java:78) 
    at RunClient.main(RunClient.java:11) 

を取得します。

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils 
    at  Handlers.ConnectionHandler.readAndSaveImage(ConnectionHandler.java:39) 
    at Handlers.ConnectionHandler.run(ConnectionHandler.java:25) 
    at java.lang.Thread.run(Thread.java:745) 

Maven依存関係はクラスパスには組み込まれていません??? 私は何か間違っているのですか? 私はあなたが子供のPOMSは、依存関係を継承させるために、親ポンポン内dependencyManagementタグを使うべきだと思う私は二日、私の頭を壊しています...今

+0

あなたの質問のすべての詳細を読まなくても、ここで答えを見つけてください。https://stackoverflow.com/questions/16222748/building-a-fat-jar-using-maven – andgalf

+0

あなたはそうではないようです依存関係を最終的なjarファイルに追加する。可能な解決策については、このコメントをチェックしてください:https://stackoverflow.com/a/32316071/2960034 –

答えて

1

あなたの依存関係は.jarファイルに含まれていないため、彼らは見つけることができません。したがって、NoClassDefFoundError

あなたがしなければならないことは、あなたのjarに依存関係を含めることです。すなわち、いわゆる "fat jar"を構築することです。

stackoverflowには既に多くの投稿があるので、私はそれを行う方法を投稿しません。私はあなたがすでにコメントのいくつかを持って参照してください。

EDIT:依存関係が含まれているかどうかをテストするには、生成された.jarファイルを7zipで開くことができます。

+0

それはとても感謝しました。同じ問題を抱えている他の人はhttps://stackoverflow.com/questions/1729054/including-dependencies-in-a-jar-with-mavenからコードをコピーして、メイン/親pom.xmlの中に入れました – mixtou

0

を助けてください。

チェックこのリンクは

differences between dependencymanagement and dependencies in maven

+0

dependencyManagementは子モジュールの依存関係の継承につながりません。とにかく、これは問題ではありません。問題は太った瓶を作ることです。 – andgalf

+0

あなたは正しいです、私は誤解を招いて申し訳ありません。とにかく、あなたはとにかくchidrenに依存関係を追加する必要があると思います。 –

+0

問題はDeiAndreiとandgalfが言いました。解決のためのDeiAndreiの返信で私の​​コメントをチェックしてください。 – mixtou

0

スタンドアロンJavaアプリケーションを開発する場合、依存関係はすべてコンパイル段階でのみ使用されます。実際のコードを実行するには、Java仮想マシンがコードを実行するための特定の依存関係のアドレスを持っている必要があります。そのためには、Java仮想マシンにライブラリの検索場所を明示的に伝える必要があります。あなたはこのようなあなたの-cpオプションに、すべてのライブラリを追加することができます。

java -cp {your-maven-repository-folder}/org/apache/common/commons-io/commons-io-1.3.2.jar:target/Client-1.0.jar RunClient 

通常、ユーザーのホームフォルダにある{あなた-のMavenリポジトリフォルダ}します。たとえばLinuxの場合は/home/mixtou/.m2/repositoryです。

すべて依存関係をLinuxで:、ウィンドウで;に区切る必要があります。

既にIntelliJを使用しているので、より簡単な解決策の1つはRunClientまたはRunServerクラスを右クリックし、Runを選択することです。これにより、IntelliJはRun panelでプロジェクトを実行しようとします。実行出力の最初の行をチェックすると、IntelliJが必要なすべてのライブラリを含むコードを実行するために使用している正確なコマンドが表示されます。

スタンドアロンのJavaアプリケーションでは、jarファイルに依存性が含まれないことに注意してください。このようなオプションは、アプリケーションサーバー上で実行されるアプリケーションでは、warまたはearファイルとしてのみ使用できます。もちろん、すべてのライブラリをあなたのjarファイルにマージするいくつかのMavenプラグインを使うことができます(普通はfat jarと呼ばれています)。そしてクラスパスで何も指定する必要はありませんが、あなたが使っているライブラリの数)と更新するのはもっと面倒です。

関連する問題