2012-05-12 22 views
40

私の最初のMavenの使用で、依存関係が張り付いています。NoClassDefFoundError on Mavenの依存関係

EclipseでMavenプロジェクトを作成し、依存関係を追加しましたが、問題なく動作していました。

しかし、私は、コマンドラインを介して、それを実行しよう:

$ mvn package # successfully completes 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies 

これは、依存関係をダウンロードし、正常にビルドが、私はそれを実行しようとすると、私はNoClassDefFoundErrorが出る:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10) 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
     ... 3 more 

マイポンポン.xmlは次のようになります。

<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>tr.edu.hacettepe.cs.b21127113</groupId> 
    <artifactId>bil138_4</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>bil138_4</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies>   
    <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId>   
    </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId>    
     </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

誰でも手助けできますか?

答えて

16

when I try to run it, I get NoClassDefFoundError

どのように実行しますか?おそらく、あなたのmavenクラスパスを正しくインポートせずにeclipseでそれを実行しようとしています。そのためには、eclipseとmavenを統合するためのプラグイン(m2eclipse)を参照してください。

あなたのMavenの設定が正しいことを確認するには、あなたが使用してexec pluginを使用してアプリケーションを実行できます。

mvn exec:java -D exec.mainClass=<your main class> 

更新:まず、exec:javaを実行しているときに、あなたのエラーについては、あなたの主なクラスがtr.edu.hacettepe.cs.b21127113.bil138_4.Appです。クラス名について言えば、(ほぼ)常にドット区切りです。単純なクラス名はちょうど最後の部分です:Appあなたの場合。完全修飾名は完全なパッケージと単純なクラス名です。これは、あなたが何かを実行したいときにmavenやjavaに与えるものです。あなたが使用しようとしていたのは、ソースファイルへのファイルシステムパスでした。それはまったく違う獣です。クラス名は、通常、ファイルシステム内のソースファイルと比較して、クラスパスにあるクラスファイルに直接変換されます。具体的には、mavenがtarget/classesにコンパイルされるので、問題のクラスファイルはおそらくtarget/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.classになります。javaは伝統的にパッケージングレベルごとにディレクトリを作成します。

あなたの元の問題は、あなたがクラスパス上にジャクソンジャーを入れていないということです。コマンドラインからjavaプログラムを実行するときは、クラスパスを設定して、クラスのロード先を知る必要があります。独自のjarを追加しましたが、必要なものは追加しませんでした。あなたのコメントは、あなたが手動でクラスパスを構築する方法を理解していないと思います。要するに、クラスパスには、クラスファイルを含むディレクトリとクラスファイルを含むJARの2つのものがあります。 jarファイルを含むディレクトリは動作しません。クラスパスの構築の詳細については、Setting the class pathおよびjavaおよびjavacツールのドキュメントを参照してください。

あなたのクラスパスには、ラインフィード、少なくとも、とせずにする必要があります:Windows上の区切りがセミコロンであることを

target/bil138_4-0.0.1-SNAPSHOT.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar 

注意を(;)。

もっと早く気づかなかったことをお詫び申し上げます。問題はあなたの元の投稿にそこに座っていたが、私はそれを逃した。

+0

このエラーを取得する:http://pastebin.com/g2txkMY6。私はm2eclipseプラグインでEclipse上で実行することができます、私はそれにアプリケーションを開発しました。私はコマンドラインで実行する方法を理解できません。私のMavenクラスパスをインポートする方法は? 編集:Javaコマンドに-classpath /home/utdemir/.m2/repository/パラメータを追加してみましたが、まだ運がありません。 – utdemir

+1

私の答えを更新しました。 –

+0

ありがとうございます。あなたが言うようにクラスパスを設定し、問題を解決したものとしてマークします。しかし、私はさらにいくつかの質問があります: 1- execプラグインのクラスパスにJacksonを追加する必要はありません。 2 Execプラグインでプロジェクトをコンパイルする必要があるので、mvnコンパイルやパッケージを実行する必要があります。 3このコードは私の割り当てです。クラスパスにライブラリを追加するのは責任ですか、それとも何かする必要がありますか? – utdemir

80

デフォルトでは、MavenはビルドするJARファイルに依存関係をバンドルせず、コマンドラインでJARファイルを実行しようとしているときにクラスパスにそれらを提供していません。これは、コードを実行しようとしているときにJava VMがライブラリクラスファイルを見つけることができない理由です。

-cpパラメータを使用してクラスパスにライブラリを手動で指定できますが、すばやく面倒です。

もっと良い解決策は、ライブラリコードを出力JARファイルに「シェード」することです。これを行うにはmaven-shade-pluginと呼ばれるMavenプラグインがあります。あなたはPOMに登録する必要があり、mvn packageを実行すると、あなたのクラスとクラスを含む "uber-JAR"も自動的に構築されます。単純にすべての必要なライブラリをバンドルする

、あなたのPOMに次の行を追加します。あなたがしたい場合は

$ mvn package 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App 

:これが完了すると

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

、あなたは上記の使用されるコマンドを再実行することができますJARファイルを含めるべきか、実行可能なJARファイルのMain-Classを指定するかなどのシェード・プラグインの追加設定を行います。maven-shade-plugin siteの「例」を参照してください。

+3

誰かがこの回答に遭遇した場合、ここではプラグインの実際のバージョンを入手できます。1.6はかなり古いものです:http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -plugin – Scadge

2

依存関係のためにpomファイルにclasspathを作成する必要があります。したがって、すべての依存関係を1つの場所にコピーする必要があります。

私のブログをチェックしてください。プロジェクトに選択 http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

<build> 
 
    <plugins> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-dependency-plugin</artifactId> 
 
    <version>2.1</version> 
 
    <executions> 
 
    <execution> 
 
     <id>copy-dependencies</id> 
 
     <phase>package</phase> 
 
     <goals> 
 
     <goal>copy-dependencies</goal> 
 
     </goals> 
 
     <configuration> 
 
     <outputdirectory>${project.build.directory}/lib</outputdirectory> 
 
     <overwritereleases>false</overwritereleases> 
 
     <overwritesnapshots>false</overwritesnapshots> 
 
     <overwriteifnewer>true</overwriteifnewer> 
 
     </configuration> 
 
    </execution> 
 
    </executions> 
 
    </plugin> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-jar-plugin</artifactId> 
 
    <version>2.4</version> 
 
    <configuration> 
 
    <archive> 
 
     <manifest> 
 
     <addClasspath>true</addClasspath> 
 
     <classpathPrefix>lib/</classpathPrefix> 
 
     <mainClass>$fullqualified path to your main Class</mainClass> 
 
     </manifest> 
 
    </archive> 
 
    </configuration> 
 
    </plugin> 
 
    
 
    </plugins> 
 
    
 
    
 
</build>

2

を解決する必要がありますこれは、Morphiaジャーがあなたの出力戦争/ jarファイルの一部ではないためです。 Eclipseやローカルビルドではクラスパスの一部としてそれらが含まれていますが、リモートビルドや自動/スケジュール設定ビルドではクラスパスの一部と見なされません。

プラグインを使用して依存jarを含めることができます。

私の場合は、あなたのポンポンのプラグインセクション

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.0.0</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
-1

に以下の追加スニペット、Mavenのバイナリはトラブルの達人を引っ張って/依存関係を保存引き起こし、私の会社のラップトップ(プログラムファイル\の達人)で保護されたフォルダの中に入れましたリポジトリ、したがって、見つからないのDEP(NoClassDefFoundErrorが)

を置くだけのMavenでのC:\ mavenの

Instructions

+0

この回答は、OPの質問とは関係ありません。 – shiri

+0

私の場合、エラーは同じでした:NoClassDefFoundError 理由:プロジェクトのJava依存関係が見つかりませんでした。リポジトリを正しく作成/管理することができませんでした。 この解決策を適用した後にこのエラーが解消されました... @shiriどのように私の答えは質問とは関係がないと言いますか? – cepix