【问题标题】:java.lang.ClassNotFoundException / NoClassDefFoundError for com/fasterxml/jackson/databind/ObjectMapper with Maven带有 Maven 的 com/fasterxml/jackson/databind/ObjectMapper 的 java.lang.ClassNotFoundException / NoClassDefFoundError
【发布时间】:2014-09-26 20:52:35
【问题描述】:

我在尝试运行使用 jackon 的 ObjectMapper 类的 java 程序时收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
  at com.inin.dynamotransfer.DynamoTransfer.importData(DynamoTransfer.java:133)
  at com.inin.dynamotransfer.DynamoTransfer.main(DynamoTransfer.java:67)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
  ... 2 more

我在 ~/.m2/repository/com/fasterxml/jackson/core/jackson-[packagename]/2.4.0 下的 Maven 存储库中有 Jackson 注释、数据绑定(包含 ObjectMapper)和核心 JAR。这是我的 pom.xml 的依赖项部分:

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.4.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.4.0</version>
    </dependency>
</dependencies>

这是我的类路径:

:/Users/myusername/Library/Java/Extensions:/Library/Java/Extensions:/Users/myusername/.m2/repository

所以 Maven 对这些 JAR 了如指掌——在哪里获取 em,在哪里放置 em,等等——但 java 本身似乎无法找到我需要的类。我究竟做错了什么??谢谢!

【问题讨论】:

  • 感谢弗雷德里克。我通过将 Jackson JAR 复制到 ~/Library/Java/Extensions 解决了我的问题。我仍然不确定为什么我之前能够运行我的程序,而没有这样做。我猜当您通过 exec 插件执行程序时,Maven 使用它的 JAR 存储库,但 java 命令没有。这也不能解释为什么当我通过命令行 -cp 选项传递 JAR 的位置时 java 找不到 Jackson。

标签: java maven classpath fasterxml


【解决方案1】:

尝试重做 maven 生命周期目标:

mvn clean install -U

【讨论】:

    【解决方案2】:

    默认的 maven 插件不会构建带有依赖项的胖 jar。

    要构建一个与其依赖项捆绑在一起的 jar,以便我们可以使用 java -jar 执行它,我们可以使用 maven-assembly-plugin,它将名称为 xxx-jar-with-dependencies.jar 的 jar 打包。

    这是一个示例pom.xml

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.example.yourMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    现在你应该可以运行你的 jar 了

    java -jar xxx-jar-with-dependencies.jar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2022-09-20
      • 1970-01-01
      • 2020-09-22
      相关资源
      最近更新 更多