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