development

Maven 종속성에 대한 NoClassDefFoundError

big-blog 2020. 11. 27. 20:59
반응형

Maven 종속성에 대한 NoClassDefFoundError


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로 실행하려고 할 것입니다. maven을 eclipse와 통합 하려면 m2eclipse 플러그인을 참조하십시오 .

maven 구성이 올바른지 확인하려면 다음을 사용하여 exec 플러그인으로 앱을 실행할 수 있습니다 .

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.classmaven이으로 컴파일 target/classes되고 Java는 전통적으로 각 패키징 수준에 대한 디렉토리를 생성 하기 때문에 있을 것입니다 .

원래 문제는 클래스 경로에 Jackson 항아리를 넣지 않았다는 것입니다. 명령 줄에서 Java 프로그램을 실행할 때 클래스를로드 할 수있는 위치를 알 수 있도록 클래스 경로를 설정해야합니다. 자신의 항아리를 추가했지만 다른 필수 항아리는 추가하지 않았습니다. 귀하의 의견은 수동으로 클래스 경로를 작성하는 방법을 이해하지 못하는 것 같습니다. 간단히 말해, 클래스 경로에는 클래스 파일을 포함하는 디렉토리와 클래스 파일을 포함하는 jar의 두 가지가있을 수 있습니다. 항아리가 포함 된 디렉토리는 작동하지 않습니다. 클래스 경로 빌드에 대한 자세한 내용은 " 클래스 경로 설정 "및 javajavac 도구 문서를 참조하십시오.

클래스 경로는 최소한 줄 바꿈이 없어야합니다.

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에서 구분 기호는 세미콜론 (;)입니다.

빨리 알지 못해 죄송합니다. 문제는 원래 게시물에 있었지만 놓쳤습니다.


기본적으로 Maven은 빌드하는 JAR 파일에 종속성을 번들로 제공하지 않으며 명령 줄에서 JAR 파일을 실행하려고 할 때 클래스 경로에 종속성을 제공하지 않습니다. 이것이 Java VM이 코드를 실행하려고 할 때 라이브러리 클래스 파일을 찾을 수없는 이유입니다.

-cp매개 변수 를 사용하여 클래스 경로에 라이브러리를 수동으로 지정할 수 있지만 이는 금방 지루해집니다.

더 나은 해결책은 라이브러리 코드를 출력 JAR 파일로 "음영 처리"하는 것입니다. 이를 수행하기위한 maven-shade-plugin 이라는 Maven 플러그인 이 있습니다. 이를 POM에 등록해야하며,를 실행할 때 클래스와 라이브러리 코드에 대한 클래스가 포함 된 "uber-JAR"이 자동으로 빌드됩니다 mvn package.

필요한 모든 라이브러리를 번들로 묶으려면 POM에 다음을 추가하십시오.

<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>

이 작업이 완료되면 위에서 사용한 명령을 다시 실행할 수 있습니다.

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

포함되어야하는 JAR, 실행 가능한 JAR 파일에 대한 Main-Class 지정 등과 관련하여 shade 플러그인의 추가 구성을 수행하려면 maven-shade-plugin 사이트 의 "예제"섹션을 참조하십시오 .


This is due to Morphia jar not being part of your output war/jar. Eclipse or local build includes them as part of classpath, but remote builds or auto/scheduled build don't consider them part of classpath.

You can include dependent jars using plugin.

Add below snippet into your pom's plugins section

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

You have to make classpath in pom file for your dependency. Therefore you have to copy all the dependencies into one place.

Check my blog.

<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>

No one mention that this error will happen when someone messes up the version numbers in the POM file or dependency on the maven server gets removed. There's no documented solution please update this answer.

I was able to work around it by running mvn install:install-file with -Dpackaging=class. Then adding entry to POM as described here: https://stackoverflow.com/a/19066828/1308453


Choosing to Project -> Clean should resolve this

참고URL : https://stackoverflow.com/questions/10568275/noclassdeffounderror-on-maven-dependency

반응형