Gradle - 仅在测试通过时创建jar

Wes*_*Wes 4 java gradle

我是Gradle的新手.我想操作以下build.gradle内容来执行此操作.我不想单独运行测试然后通过单独的命令构建jar,而是想在一个命令中执行这两个操作,除非如果其中一个测试失败(即使它甚至不会尝试构建jar)也不会创建jar .

apply plugin: 'java'
apply plugin: 'eclipse'

version = '1.0'
sourceCompatibility = 1.6
targetCompatibility = 1.6

// Create a single Jar with all dependencies
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'com.axa.openam'
    }

    baseName = project.name

    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it) 
        }
    }
}

// Get dependencies from Maven central repository
repositories {
    mavenCentral()
}

test {
    testLogging {
        showStandardStreams = true
    }
}

// Project dependencies
dependencies {
    compile 'com.google.code.gson:gson:2.5'
    testCompile 'junit:junit:4.12'
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Giu*_*ero 6

最简单的解决方案是gradle按顺序放置要执行的所有任务.所以你可以使用以下内容:

gradle clean test jar
Run Code Online (Sandbox Code Playgroud)

任务突破

  • clean:这主要用于安全地移除最后一个过时的jar(这不是强制性的);
  • test:执行测试;
  • jar:创建jar工件.

关键点:如果某个任务因某种原因失败而gradle停止执行.

因此,如果由于某种原因导致单个测试失败,则抛出异常并且根本不创建jar文件.


替代解决方案:添加'test'作为'jar'的依赖

只是为了探索其他一些可能性:修改build.gralde文件如下:

[...]
jar {
    dependsOn 'test'
    [...]
}
[...]
Run Code Online (Sandbox Code Playgroud)

现在,每次运行时gradle jartest 任务自动之前执行.


使用'dependsOn'模拟纯命令行解决方案

gradle clean test jar使用依赖方法模拟第一个命令行方法(即),您必须进一步修改build.gradle.这是因为无法保证dependsOn按顺序评估多个语句:

[...]
jar {
    dependsOn 'clean'
    dependsOn 'test'
    tasks.findByName('test').mustRunAfter 'clean'
    [...]
}
[...]
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

gradle jar
Run Code Online (Sandbox Code Playgroud)

并且在实际任务之前执行任务cleantest(以正确的顺序)jar执行.