2013-08-12 17 views
11

私がやっているのは、メインクラス(メインメソッドを持つクラス)を実行するbuild.gradleのタスクを作成することですが、どうすればよいか分かりません。メインクラスを呼び出すタスクを作成する方法

私はそれを行う方法をテストするテストプロジェクトを作成しました。ここでは、ファイル構造のレイアウトは次のとおりです。ここで

testProject/ 
    build.gradle 
    src/main/groovy/hello/world/HelloWorld.groovy 

はbuild.gradleの内容である:ここで

apply plugin: 'groovy' 
apply plugin: 'maven' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile  'org.codehaus.groovy:groovy-all:2.0.6' 
} 

task(hello, dependsOn: jar, type: JavaExec) { 
    main = 'hello.world.HelloWorld' 
} 

はHelloWorld.groovyの内容です:

package hello.world 

class HelloWorld { 
    public static void main(String[] args) { 
     println "Hello World!" 
    } 
} 

ここで、私がありますシェルから得る:

testProject>$ gradle hello 
:compileJava UP-TO-DATE 
:compileGroovy UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:jar UP-TO-DATE 
:hello 
Error: Could not find or load main class hello.world.HelloWorld 
:hello FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':hello'. 
> Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Total time: 4.232 secs 

だから、私の質問は:どのように私はgradle helloを動作させることができますか?どうもありがとうございました。

答えて

14

私はちょっとしたグーグルで解決策を見つけました。変更する必要があるのはタスクブロックのみです。

task(hello, dependsOn: jar, type: JavaExec) { 
    main = 'hello.world.HelloWorld' 
    classpath = sourceSets.main.runtimeClasspath 
} 
9

これを行うためにapplication pluginがあります。

apply plugin: 'application' 
mainClassName = 'hello.world.HelloWorld' 

そしてまたassembleタスクの動作を変更しますアプリケーションプラグインを適用し、runタスクを追加するだけでなく

gradle run 

を呼び出します。これで、シェルスクリプトを使用して実行できるスタンドアロンのアプリケーションが作成されます。

apply plugin: 'groovy' 

task(hello, type: JavaExec) { 
    main = 'hello.world.HelloWorld' 
    classpath = files('exampleDir/bin','jars/groovy-all-2.0.1.jar') 
} 

JavaExecタスクに 'classpath' 引数:

+0

ただ1つのタスクを実行するだけでいいです。メインクラスのタスクが複数ある場合はどうなりますか? – JBT

+0

次に、JavaExecタスクを使用します。 –

+0

受け入れられた答えよりずっと簡単で洗練された解決策 – kellyfj

2

は簡易版であるこのbuild.gradleを、考えてみましょう。

exampleDir/src/hello/world/HelloWorld.groovy 
exampleDir/bin/hello/world/HelloWorld.class 
jars/groovy-all-2.0.1.jar 

(A)グルービー-全2.0.1.jar私GROOVY_HOMEからコピー/埋め込み(B)HelloWorld.groovyを介してコンパイルされ、これはのようなサブディレクトリを使用します次のようになります:

package hello.world 

class HelloWorld { 
    public static void main(String[] args) { 
     println "Hello World!" 
    } 
} 
+0

helloタスクブロックに次の行を追加しました:classpath = files(' build/libs/testProject.jar '、' build/classes/main ')、あなたのクラスパスに相当します。しかし、それは動作しませんでした。これは、java.lang.NoClassDefFoundError:groovy/lang/GroovyObjectをスローします。 – JBT

+0

私があなたのソリューションについて気に入っていないもう一つの問題は、groovy jarのような依存関係を手動で管理することです。 – JBT

+0

あなたの最初のコメントのために、あなたの追加は明らかに答えのclasspathと同等ではありません。 HelloWorld.groovyがgroovycでコンパイルされている場合は、Groovy jarをクラスパス上に配置して使用する必要があります。マニュアルの性質が理想的ではないことは事実ですが、それは別の問題です。 –

0

クラスパスとしてsourceSets.main.runtimeClasspathを指定するだけでは不十分である可能性があります。 NoClassDefFoundErrorが表示された場合は、これが役立ちます。

task(hello, dependsOn: jar, type: JavaExec) { 
    main = 'hello.world.HelloWorld' 
    classpath(sourceSets.main.runtimeClasspath, sourceSets.main.compileClasspath) 
} 
関連する問題