1. ホーム
  2. java

Mavenの依存関係でNoClassDefFoundErrorが発生する

2023-09-17 14:37:50

質問

初めて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

私のpom.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>

誰か助けてください。

どのように解決するのですか?

<ブロッククオート

実行しようとすると、NoClassDefFoundErrorが発生します。

どのように実行するのですか?mavenのクラスパスを正しくインポートせずに、eclipseで実行しようとしているのでしょう。以下を参照してください。 m2eclipse プラグインを参照してください。

maven の設定が正しいかどうかを確認するには、アプリを実行する際に 実行プラグイン を使って実行します。

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

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

あなたの元の問題は、単にJackson jarをクラスパスに置いていないことです。コマンド ラインから Java プログラムを実行する場合、どこからクラスをロードできるかを知らせるために、クラス パスを設定する必要があります。あなたは自分のjarを追加しましたが、他の必要なjarを追加していません。あなたのコメントから、手動でクラスパスを構築する方法を理解していないように思えます。要するに、クラスパスには、クラスファイルを含むディレクトリとクラスファイルを含むjarの2つがあります。jarを含むディレクトリは動作しません。クラスパスの構築の詳細については、" を参照してください。 クラスパスの設定 "を、そして ジャバ javac ツールのドキュメントを参照してください。

あなたのクラスパスは少なくとも、改行がないことが必要でしょう。

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

Windowsのセパレータはセミコロン(;)であることに注意してください。

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