2017-02-25 39 views
1

を使用しているとき、私は私のコードは、"java.lang.NoClassDefFoundErrorが:COM/fasterxml /ジャクソン/データバインド/ ObjectMapper" のGradle

あるジャクソン2

を使用してJavaオブジェクトにJSONを変換するための簡単なテストプログラムを書いています

package test; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import java.net.URL; 

public class UseJson{ 

    public static void main(String[] args){ 

     ObjectMapper mapper = new ObjectMapper(); 
     try{ 
      SomeClass obj = mapper.readValue(new URL("http://someurl"), SomeClass.class); 
     } 
     catch(Exception ex){ 
      System.out.println(ex.toString()); 
     } 
    } 
} 

そしてbuild.gradleファイル

repositories { 
    mavenCentral() 
} 

apply plugin: 'java' 

dependencies{ 
    compile('com.fasterxml.jackson.core:jackson-databind:2.8.6') 
    compile('com.fasterxml.jackson.core:jackson-core:2.8.6') 
    compile('com.fasterxml.jackson.core:jackson-annotations:2.8.6') 
} 

jar { 
     manifest { 
       attributes 'Main-Class': 'test.UseJson' 
     } 
} 

ですが、プログラム

を実行しようとしたとき、私は例外を取得しています
java -jar ./build/libs/JsonTest.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 
     at test.UseJson.main(UseJson.java:10) 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 1 more 

関連記事java.lang.ClassNotFoundException/NoClassDefFoundError for com/fasterxml/jackson/databind/ObjectMapper with MavenおよびCorrect set of dependencies for using Jackson mapperは問題を解決しません。


編集:私は手動でのjavacと依存関係のjarファイルを使用してプログラムをコンパイルしようとしたとき は、それが働きました。問題は、gradleビルドファイルでなければなりません。

+0

さて、Jarを実行しているときにクラスパスにJacksonを追加していないので、クラスパスでは使用できません。なぜそれはすべきだと思いますか?アプリケーションプラグインを使用して、クラスパスマニフェストエントリにリストされているすべての依存関係を持つ実行可能なjarファイルを生成し、開始スクリプトを含む必要なすべてを含むアプリケーションの配布を生成させます。 –

+0

@JBNizetありがとう!私はまた、シャベルプラグインがウーバージャーを作ることを発見しました。アプリケーションプラグインのように、uber jarを作成するかzipファイルを作成する方が良いかどうかを知ることができますか? –

+0

アプリケーションプラグインが優れています。 uber-jarはハックであり、多くの場合、人々はライブラリとしてuber jarを使用し始め、何も期待どおりに機能しないのか疑問に思う。 –

答えて

1

あなたのアプリにライブラリをパックする必要があります。

jar { 
archiveName = 'Name.jar' 

manifest { 
    attributes 'Main-Class': 'Main', 
      'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '), 
      'Implementation-Version': project.version (if any) 
} 

from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) 
} 

その他の解決方法は、 jarプラグインを使用します。

applicationプラグインを使用することをお勧めします。どうして ?それはサポートされている、それはほとんどの開発者が使用しているGradleだ。

関連する問題