2017-01-19 27 views
0

私はかなり単純な問題に苦しんでいますが、解決策を見つけることができません。 要は、最近私はGradleを学び始め、このビルドツールで初めてのIntellijプロジェクトを作成することに決めました。アプリケーションはGradleでビルドされましたが、IDEからは正常に起動しましたが、コンソールからは正常に起動しません

group 'ant.rozanski' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 

sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.fasterxml.jackson.core:jackson-databind:2.2.3' 
     classpath 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.3.0' 
    } 
} 
dependencies { 
    testCompile 'org.junit.jupiter:junit-jupiter-api:5.0.0-M3' 
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.3.0' 
    compile 'com.fasterxml.jackson.core:jackson-databind:2.2.3' 

    compile 'org.apache.commons:commons-lang3:3.4' 
} 

そしてプロジェクトがのIntelliJ「ファイル名を指定して実行」コマンドからうまく起動します:build.gradleに定義されているように私は、外部ライブラリを使用しています。私は、コンソールからそれを実行しようとする。しかし、残念ながら、私はこの例外を受け取る:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonFactory 
    at model.AALJourney.setParams(AALJourney.java:40) 
    at model.AALJourney.doJob(AALJourney.java:24) 
    at Start.main(Start.java:11) 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonFactory 
    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) 
    ... 3 more 

のGradleは、クラスパス上にそれらの外部LIBSを入れていないように見えます。どうして?これをどうすれば解決できますか?

答えて

1

おそらく、Gradleのapplicationプラグインを使用してください。これは、クラスパスが正しく設定されているrunタスクを提供します。また、必要に応じてクラスパスを設定するWindowsおよび* nix起動スクリプトで配布可能なパッケージを構築するタスクも提供します。

あなたが表示したものがフルbuild.gradleであれば、buildscriptブロック全体は意味を持ちません。ビルドスクリプトのクラスパスにJacksonを追加しますが、どこにも使用しません。 buildscriptブロックでは、必要な依存関係をビルドスクリプトに追加します。たとえば、いくつかのGradleプラグインなどがあります。

+0

ええ、私の問題を探しているときにどこかで見つけた 'buildscript'ブロック。私が言及したように、私は最近、Gradleを使い始めました。そして、Intellijを使わずに学習を始めたはずです。私の問題について: 'application'プラグインを使ってMainクラス('。\ gradlew run start'を使って)を走らせることができました。今私はいくつかのコマンドライン引数をアプリケーションに渡す必要があります。あなたはたぶんそれをする方法を知っていますか?残念ながら、Googleはあまり助けにはならない。ありがとうございました。 – 3voC

+1

ビルドスクリプトの引数をハードコードすることもできますし、ビルドスクリプトの引数を半ハードコードすることもできます。プログラムにプロジェクトプロパティを指定し、 '-P'でgradleコマンドラインで設定することができます。 'run'の代わりに' installApp'を使うことができます。そして、ビルドしたアプリケーションを 'build/install /'で配布zipのように使うことができます。そして 'bin/'を実行し、エンドユーザのような任意のパラメータを与えます。あなたはGradle Userguideを読むべきです、それはGradleを学ぶための優れたリソースです。 – Vampire

1

java -jar ..などのコンソールからクラスやjarを実行しているとします(コンソールからの実行方法や実行中のことについては言及していませんが、そうでない場合はこれを明確にする必要があります)これは正しいようです。 IDEのRunターゲットは、アプリケーションのクラスパスを設定する方法を知っています。

すべての外部依存関係への参照を含む実行可能なjarを生成するためのIDEターゲットがあります。しかし、あなたが裸のjarファイルを持っている場合は、カスタムクラスパスを使ってJVMを起動する必要があります。あるいは、第三者のライブラリを含むrunnable jarファイルをロールアップすることもできます。

Gradleは依存関係のjarファイルをキャッシュするので、これらのパスを使用してクラスパスを構築することができます。

+0

私はビルドディレクトリから 'java Class'を使って走っています。 Gradleはjarの.gradleディレクトリにlibsを格納します。どうすれば簡単にクラスパスに追加できますか? – 3voC

+0

IDEには、配布可能で実行可能なJarfilesを作成するジェスチャーがあります。私はintellijのアイデアがどのようにメニューにこれらのジェスチャーを提示するのか覚えていますが、そこにあります。 – jdv

関連する問題