2013-07-11 11 views
7

私は現在、mainメソッドでJavaクラスを実行するだけで動作するgradleビルドスクリプトを持っています。私が知りたいことは、同じクラスで静的メソッドを呼び出すにはどうすればよいのですが、mainメソッドを実行する必要はありません。Gradleから静的なJavaメソッドを呼び出す方法

import org.apache.tools.ant.taskdefs.condition.Os 
apply plugin: 'java' 

defaultTasks 'runSimple' 

project.ext.set("artifactId", "test-java") 

File rootDir = project.getProjectDir() 
File targetDir = file("${rootDir}/target") 
FileCollection javaClasspath = files("${targetDir}/tools.jar") 

task(runSimple, dependsOn: 'classes', type: JavaExec) { 
    main = 'com.test.model.JavaTest' 
    classpath = javaClasspath 
    args 'arg1' 
    args 'arg2' 
} 

をそして、私のJavaクラスは、次のように:

:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:runSimple 
In main 
In anotherMethod 
arg1 arg2 

BUILD SUCCESSFUL 

Total time: 2.344 secs 

私の質問は、私はスキップすることができますどのように単純です:

package com.test.model; 

public class JavaTest { 

    public static void main(String[] args) throws Exception { 
     System.out.println("In main"); 
     anotherMethod(args[0], args[1]); 
    } 

    public static void anotherMethod(String arg1, String arg2) { 
     System.out.println("In anotherMethod"); 
     System.out.println(arg1 + " " + arg2); 
    } 
} 

これは私に出力を与え、次のように現在のGradleコードがありますメインのメソッドを呼び出し、メソッド "anotherMethod"をgradleスクリプトから直接呼び出しますか?出力は、単純に次のようになります。

In anotherMethod 
arg1 arg2 

おかげ

+0

Gradleビルドのコンテキスト(つまりクラスローダー)で実行するのか、別のプロセスとして実行しますか? 'JavaExec'タスクはシェルから' java'コマンドを呼び出すのと同じように動作します。これは常に 'main'メソッドを実行します。 – ajoberstar

+0

私は理想的には別のプロセスとして実行するのが好きです。 Gradleでこれを達成する方法はありますか?さらに、このJavaメソッドは、Gradleスクリプトの実行中に何度も呼び出されます。したがって、同じJavaメソッドを呼び出すたびに新しいJVMを起動せず、同じJVM内で実行することをお勧めします。それは理にかなっていますか? – user1683481

+0

Hmm ...同じプロセスを使って繰り返し呼び出すことができる別個のプロセスにしたい場合は、デーモンやサービスのように見えます。 Gradleの 'JavaExec'は、シェルから' java'コマンドを呼び出すのと同等のものをサポートしています。つまり、** once **を指定したクラスのmainメソッドを実行します。 Gradleは必要なGroovyコードを実行できますので、これを行うことは可能ですが、わかりやすい方法はありません。 – ajoberstar

答えて

0

あなたがスクリプトのクラスパスを構築するのGradleにクラスを追加する必要があります静的メソッドを実行したい場合。あなたのコードがリポジトリにある場合、スクリプトはクラスパスのビルドにコードを追加する

buildscript { 
    repositories { 
     maven { url "${yourRepositoryURL}" } 
    } 
    dependencies { 
     classpath 'com.yourgroup:yourpackagename:version' 
    } 
} 

をビルドスクリプトにコードを追加するには、あなたのコードがローカルで構築されている場合には(私はこれをテストしていないクラスパス1):

buildscript { 
    dependencies { 
     classpath files("path/to/where/the/class/files/are") 
    } 
} 

次に、あなただけの、他の同じようそのメソッドを呼び出すことができる必要があります:

task runSimple(dependsOn: 'classes') { 
    doFirst() { 
     com.test.model.JavaTest.anotherMethod('arg1', 'arg2') 
    } 
} 
+4

タスクrunSimpleは動作していません:タスク 'com'のプロパティを見つけることができませんでした... – telebog

+0

ええ..これはまったく動作しません..と私はまだこれを行うエレガントな方法を見つけることができません..私はJavaの単一行のクラスを作成する必要はありません –

+1

これを修正しますか?あなたのコードを共有してください。 –

1

クラスパスにjarまたはクラスを追加する必要があります。ここにクラスを含むjarファイルの例があります。 ファイルbuild.gradleの中に依存関係を追加します。 私のjarファイルはlib/MQMonitor.jarlibフォルダにあります。

import mypackage.MyClass 
buildscript { 
    repositories { 
     flatDir name: 'localRepository', dirs: 'lib' 
    } 
    dependencies { 
     classpath name: 'MQMonitor' 
    } 
} 

task myTaskCallJava << { 
    MyClass.foo() 
} 
関連する問題