2014-09-26 37 views
9

otrzymuję następujący błąd podczas próby uruchomienia programu java, który używa jackon za ObjectMapper Klasa:java.lang.ClassNotFoundException/NoClassDefFoundError dla com/fasterxml/Jackson/DataBind/ObjectMapper z 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 

mam Adnotacje Jacksona, databind (która zawiera ObjectMapper) i podstawowe pliki JAR w repozytorium Maven pod ~/.m2/repository/com/fasterxml/jackson/core/jackson- [nazwa-pakietu] /2.4.0. tutaj jest odcinek zależności od mojego 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> 

oto moja CLASSPATH:

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

tak Maven wie wszystko o tych słoików - gdzie dostać em, gdzie umieścić em, itd. - ale java nie może znaleźć klas, których potrzebuję. Co ja robię źle?? dzięki!

+0

spojrzeć http://stackoverflow.com/questions/18429468/correct- set-of-dependencies-for-using-jackson-mapper –

+0

dzięki Fryderykowi. Rozwiązałem swój problem, kopiując pliki JAR Jacksona do ~/Library/Java/Extensions. Nadal nie jestem pewien, dlaczego byłem w stanie uruchomić mój program wcześniej, nie robiąc tego. Domyślam się, że Maven używa repozytorium JAR podczas wykonywania programu za pomocą wtyczki exec, ale polecenie java tego nie robi. to również nie wyjaśnia, dlaczego java nie może znaleźć Jacksona, gdy przekazałem lokalizację JARów za pomocą opcji wiersza poleceń -cp. –

Odpowiedz

2

spróbuj przerobić Maven cele cyklu życia:

mvn clean install -U 
2

Domyślne wtyczki Maven nie budować tłuszczu słoik z zależnościami.

Aby zbudować jar w pakiecie z jego zależnościami, abyśmy mogli go uruchomić z java -jar, możemy użyć maven-assembly-plugin, który pakuje słoik o nazwie xxx-jar-with-dependencies.jar.

Oto próbka 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> 

Teraz powinieneś być w stanie uruchomić słoik z

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