2013-07-11 4 views
7

У меня есть сценарий построения градиента, который в настоящее время работает, просто выполняя класс Java через его основной метод. Я хочу знать, как я могу вызвать статический метод в том же классе, но не должен проходить основной метод. Текущий Gradle код выглядит следующим образом:Как вызвать статический метод Java из Gradle

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 следующим образом:

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); 
    } 
} 

Это дает мне выход:

: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 

Мой вопрос заключается лишь в том, как я могу пропустить основной метод и вызов метода «anotherMethod» непосредственно из сценария градации? Выходной сигнал будет тогда просто:

In anotherMethod 
arg1 arg2 

Благодаря

+0

Вы хотите, чтобы он запускался в контексте (то есть загрузчик классов) сборки Gradle или как отдельный процесс? Задача '' JavaExec' работает так же, как вызов команды 'java' из оболочки. Он всегда будет выполнять метод 'main'. – ajoberstar

+0

Мне бы идеально хотелось, чтобы он работал как отдельный процесс. Есть ли способ достичь этого в Gradle? Furthemore, этот Java-метод будет вызываться много раз во время выполнения сценария Gradle. Поэтому я бы хотел, чтобы он не разворачивал новый JVM каждый раз, когда он вызывал один и тот же метод Java и запускался в пределах одной JVM. Имеет ли это смысл? – user1683481

+0

Хм ... Если вы хотите, чтобы это был отдельный процесс, который вы можете вызывать многократно, используя тот же процесс, он больше похож на демона или службы. Gradle 'JavaExec' просто поддерживает эквивалент вызова команды' java' из оболочки. То есть, он будет запускать основной метод класса, который вы указываете ** один раз **. Gradle может запускать любой код Groovy, который вы хотите, поэтому я уверен, что это можно сделать, но я не вижу прямого пути. – ajoberstar

ответ

0

Если вы хотите выполнить статический метод, вам нужно будет добавить класс к Gradle построить путь к классам скрипта.

Чтобы добавить код в скрипт сборки, если ваши пути к классам код находятся в хранилище:

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

Чтобы добавить код в скрипт сборки, если пути к классам коды построена на месте (я не проверял это один):

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' on task ... – telebog

+0

да .. это вообще не работает .. и я до сих пор не могу найти элегантный способ сделать это ..Я не хочу создавать класс для одной строки Java –

+1

, исправляете ли вы это? поделитесь своим кодом, пожалуйста. –

1

вы должны добавить jar или class в путь к классам. вот пример с файлом jar, который содержит класс. Внутри файла build.gradle добавьте зависимости. Мой файл jar находится в папке lib, путь: lib/MQMonitor.jar.

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

task myTaskCallJava << { 
    MyClass.foo() 
} 
Смежные вопросы