如何从Gradle调用静态Java方法

如何从Gradle调用静态Java方法,java,gradle,build.gradle,Java,Gradle,Build.gradle,我有一个gradle构建脚本,目前只需通过主方法执行Java类即可。我想知道的是,如何在同一个类中调用静态方法,而不必经过main方法。当前的梯度代码如下所示: import org.apache.tools.ant.taskdefs.condition.Os apply plugin: 'java' defaultTasks 'runSimple' project.ext.set("artifactId", "test-java") File rootDir = project.getP

我有一个gradle构建脚本,目前只需通过主方法执行Java类即可。我想知道的是,如何在同一个类中调用静态方法,而不必经过main方法。当前的梯度代码如下所示:

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'
}
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);
    }
}
我的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'
}
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
我的问题是如何跳过main方法,直接从gradle脚本调用方法“anotherMethod”?然后,输出将是:

In anotherMethod
arg1 arg2

谢谢

如果要执行静态方法,需要将类添加到Gradle构建脚本的类路径中

要将代码添加到构建脚本类路径(如果代码位于存储库中),请执行以下操作:

buildscript {
    repositories {
        maven { url "${yourRepositoryURL}" }
    }
    dependencies {
        classpath 'com.yourgroup:yourpackagename:version'
    }
}
如果代码是在本地生成的(我没有测试这个),则将代码添加到构建脚本类路径:

然后,您应该能够像调用任何其他方法一样调用该方法:

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

您必须将jar或类添加到类路径中。下面是一个包含该类的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()
}
导入mypackage.MyClass
构建脚本{
存储库{
flatDir名称:“localRepository”,目录:“lib”
}
依赖关系{
类路径名称:“MQMonitor”
}
}

task myTaskCallJava我也一直在做这个。您知道,我喜欢eclipse和intellij的功能以及使用Junit选项运行,我想使用命令行和gradle来实现这一点

如果您可以接受将您的测试方法放在gradle的“test”目录中。事实上,我有一个公平的解决办法

package com.udacity.gradle;
import org.junit.Test;

    public class TestClass {
        @Test
        public void anotherMethod() {
            System.out.println("This is it, I want this!!!");
        }
        @Test
        public void notMyWantedMethod1() {

            System.out.println("not my wanted");
        }

        public void notMyWantedMethod2() {
            System.out.println("not my wanted");
        }

    }
这是我的测试类,它位于src/test/java/com/udacity/gradle/TestClass.java

下面是我的build.gradle文件

apply plugin: "java"
repositories {
    mavenCentral()
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}


test {
    testLogging.showStandardStreams = true
    filter {
        //include specific method in any of the tests
        includeTestsMatching "*.TestClass.anotherMethod"
    }
}
简单的想法你知道这是一个测试类,所以我使用gradle的测试任务。为了指定要使用的方法,我添加了一个测试过滤器,它可以指定具体的方法

那你就可以跑了

gradle test
然后你们可以在控制台中找到你们想要的东西。但是,请记住添加

testLogging.showStandardStreams = true
如果你不这样做,gradle会吞下你的控制台输出。但即使你不加这一行。您可以在的目录中读取测试日志

..…/build/test results/test/test-com.udacity.gradle.TestClass.xml

其中有组织良好的测试报告输出

<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.udacity.gradle.TestClass" tests="1" skipped="0" failures="0" errors="0" timestamp="2018-03-31T19:26:44" hostname="hexin-PC" time="0.022">
  <properties/>
  <testcase name="anotherMethod" classname="com.udacity.gradle.TestClass" time="0.022"/>
  <system-out><![CDATA[This is it, I want this!!!
]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>

假设类位于buildscript类路径上(应该是,因为您是从同一个类调用
main


在Gradle 4.6上测试

您希望它在Gradle构建的上下文(即类加载器)中运行,还是作为一个单独的进程运行?
JavaExec
任务的工作原理类似于从shell调用
java
命令。它将始终执行
main
方法。理想情况下,我希望它作为一个单独的进程运行。在格拉德尔有没有办法做到这一点?此外,在Gradle脚本的执行过程中,会多次调用此Java方法。因此,我希望它不要在每次调用同一个Java方法并在同一个JVM中运行时启动新的JVM。这有意义吗?嗯。。。如果希望它是一个单独的进程,可以使用同一进程重复调用,那么它看起来更像是一个守护进程或服务。Gradle的
JavaExec
只支持从shell调用
java
命令。也就是说,它将运行您指定的类的main方法一次。Gradle可以运行任何您想要的Groovy代码,所以我确信这是可能的,但我看不到任何简单的方法。为什么不使用一个调用静态方法的主方法创建一个引导类,该方法需要执行多次?这样你就只有一个JVM运行你的代码了。。这根本不起作用。。我还是想不出一个优雅的方法。。我不想为一行Java