2014-09-26 42 views
9

我在尝试运行使用同时杰克逊的ObjectMapper类的Java程序时出现以下错误:抛出java.lang.ClassNotFoundException /对NoClassDefFoundError的COM/fasterxml /杰克逊/数据绑定/ ObjectMapper与Maven

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 

我有Jackson批注,数据绑定(包含ObjectMapper)以及我的Maven仓库中的〜/ .m2/repository/com/fasterxml/jackson/core/jackson- [软件包名称] /2.4.0下的核心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> 

这里是我的CLASSPATH:

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

这样的Maven知道所有这些JAR - 从哪里得到他们,在那里把他们,等等 - 但java本身似乎无法找到我需要的类。我究竟做错了什么??谢谢!

+0

运行罐子看看http://stackoverflow.com/questions/18429468/correct-依赖于套件的使用杰克逊映射器 – 2014-09-26 23:13:01

+0

感谢弗雷德里克。我通过将Jackson JAR复制到〜/ Library/Java/Extensions来解决我的问题。我仍然不确定为什么我以前能够运行我的程序,而没有这样做。我猜Maven使用它的JAR存储库,当你通过exec插件执行一个程序时,但是java命令没有。这也不能解释为什么当我通过命令行-cp选项传递JAR的位置时,java找不到Jackson。 – 2014-09-28 14:57:49

回答

2

尝试重新Maven的生命周期目标:

mvn clean install -U 
2

默认Maven插件不会建立与依赖脂肪罐子。我们可以使用,它将名字为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> 

现在,你应该能够与

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