NoClassDefFoundError的Maven的依赖NoClassDefFoundError的

2019-05-14 01:00发布

我的第一个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>

谁能帮我?

Answer 1:

当我尝试运行它,我得到的NoClassDefFoundError

运行它怎么样? 你可能会想,而不必正确导入你的Maven类路径Eclipse来运行它。 查看m2eclipse的在Eclipse为整合Maven插件。

要验证你的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.class因为行家编译成target/classes ,和Java传统上为每个级别创建一个目录包装。

你原来的问题很简单,你有没有把杰克逊罐类路径上。 当你在命令行中运行Java程序,你必须设置类路径,让它知道在哪里可以从加载类。 您已经将自己的罐子,而不是其他必需的。 您的评论让我觉得你不知道如何手工创建一个类路径。 总之,类路径可以有两件事情:含有类文件,包含类文件罐子目录。 含罐子目录将无法正常工作。 有关构建类路径的详细信息,请参见“ 设置类路径 ”和java的和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上的分隔符是分号(;)。

我不早注意到它道歉。 这个问题是在你原来的职位坐在那里,但我错过了。



Answer 2:

默认情况下,Maven的没有捆绑在JAR文件的依赖性它生成,你也不会在类路径中提供他们,当你试图在命令行执行您的JAR文件。 这是为什么努力执行你的代码时,Java虚拟机无法找到库类文件。

你可以手动指定与在类路径中的库-cp参数,但很快就会厌烦。

一个更好的解决办法是“荫”的库代码到你的输出JAR文件。 有一个Maven插件叫做行家遮阳帘插件来做到这一点。 你需要在你的POM注册它,当你运行它会自动生成包含类和类的“超级-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文件,等等,请参阅“示例”部分行家遮阳帘插件的网站 。



Answer 3:

这是由于吗啡罐子不是你的输出战/罐的一部分。 Eclipse或本地构建包括其作为类路径的一部分,但远程建立或自动/计划建立不考虑他们的classpath的一部分。

您可以使用插件包括相关的罐子。

下面添加代码插入您的POM的插件部分

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


Answer 4:

你必须要在POM文件的classpath为你的依赖。 因此,你必须将所有依赖拷贝到一个地方。

检查我的博客 。

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


Answer 5:

没有人提到,当有人弄乱在Maven服务器上的POM文件或依赖版本号被删除会发生这种错误。 有没有文档解决方案,请更新这个答案。

我能够MVN运行安装解决它:用-Dpackaging = A类安装文件。 这里描述,然后添加条目POM: https://stackoverflow.com/a/19066828/1308453



Answer 6:

选择项目 - >清除应该解决这个



文章来源: NoClassDefFoundError on Maven dependency