10

我有一个 gradle 构建脚本,它目前通过简单地通过它的 main 方法执行一个 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

我的问题只是如何跳过主要方法,直接从 gradle 脚本中调用方法“anotherMethod”?输出将只是:

In anotherMethod
arg1 arg2

谢谢

4

4 回答 4

3

您必须将 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()
}
于 2016-08-12T11:29:10.457 回答
1

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

task runSimple {
  doLast {
    com.test.model.JavaTest.anotherMethod("foo", "bar")
  }
}

在 Gradle 4.6 上测试

于 2018-03-31T19:52:25.983 回答
1

我也一直在努力。你知道我喜欢使用 Junit 选项运行的 eclipse 和 intellij 的功能,我想使用命令行和 gradle 来实现。

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

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>
于 2018-03-31T19:41:49.770 回答
-1

如果要执行静态方法,则需要将该类添加到 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')
    }
}
于 2013-12-27T19:51:25.780 回答