当前位置: 首页 > 知识库问答 >
问题:

Maven依赖项上的NoClassDefFoundError

欧阳元魁
2023-03-14
$ 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
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>

有人能帮我吗?

共有1个答案

葛兴发
2023-03-14

默认情况下,Maven不会在它构建的JAR文件中捆绑依赖项,并且当您试图在命令行执行JAR文件时,也不会在类路径中提供依赖项。这就是Java VM在尝试执行代码时找不到库类文件的原因。

您可以使用-cp参数手动指定类路径上的库,但这很快就变得令人厌烦。

更好的解决方案是将库代码“隐藏”到输出JAR文件中。有一个名为maven-shade-plugin的Maven插件可以实现这一点。您需要在POM中注册它,当您运行MVN包时,它将自动构建一个包含类和库代码类的“Uber-JAR”。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</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
 类似资料:
  • 最近,我发现了以下问题: 当我为我的项目设置依赖项管理时,我有一个child-pom,它使用具有依赖项的插件,我想要与在我的依赖项管理中声明的依赖项同步。 在根pom中,我在依赖项管理中声明: 在子pom中,我有一个插件需要gwt-user: 但是,如果我移除gwt-maven-plugin中使用的依赖版本,编译就会失败。 是不是还有别的办法可以实现呢? PS:在maven和maven插件中有一个

  • 我试图在单节点集群(Hadoop2.4)中编写一个mapreduce程序。我在maven central Repository中找到了hadoop的maven依赖项。 哪些依赖关系是编写map-reduce程序所必需的(包括在pom.xml中)? 谢了!

  • 问题:Maven在我的测试中找不到一些依赖项 在我的pom中是这样导入的。xml: 我已经试过了: mvn测试编译 使Intellij缓存无效 重启Intellij 清除. m2并重建项目

  • 我在Netbeans-8工作 我正在构建两个项目。Project1是Project2的依赖项。 如果我在两个项目中都做了更改1 我碰巧经常更改项目1。在我的IDE中使用maven之前,我习惯于构建一个依赖项目,也构建它的依赖项。我的意思是这就是构建系统中的依赖项的全部含义... 如何解决这个问题,以便project2上的“使用依赖项构建”也构建project1?

  • 我们用Maven和Tycho构建了一个Eclipse插件。然而,目前我们仍然通过一堆手动添加的JAR文件而不是Maven来提供所有的项目依赖。这是由于以下原因:(1)依赖项不能通过标准的Eclipse更新站点获得(至少不能在当前版本中获得),(2)依赖项不能作为捆绑包获得。 这些依赖项中最大的部分是Selenium库(API,远程,特定于浏览器的库及其传递依赖项,例如Guava等)。 我浪费了几个