如何在没有源文件但使用胖罐的情况下运行 gradle JUnit 测试作业



我对JVM世界很陌生,不知道如何解决以下问题:

我有一个 gradle 项目,它创建了一个测试 uber jar(使用 shadowJar 插件构建(,并以 JUnit 测试作为其输出。我可以使用这样的东西在同一项目中运行这个超级罐子:

task runFatJar(type: Test) {
    dependsOn shadowJar
    classpath = project.files( "$buildDir/libs/fatjar.jar", configurations.runtime )
    outputs.upToDateWhen { false }
}

但是,我想要的是创建一个非常小的gradle.build文件,以使用已经预先构建的jar运行相同的作业。详细说明一下:我有我的项目 A 来创建这个胖罐子,我想有一个只有runFatJar任务而没有源的项目 B。

我尝试在我的项目 B 中做这样的事情:

apply plugin: 'java'
buildscript {
    repositories {
        jcenter()
    }
}
repositories {
    jcenter()
}
dependencies {
   testRuntime("org.junit.vintage:junit-vintage-engine:5.4.1")
}
tasks.withType(Test) {
    systemProperties = System.getProperties()
    systemProperties.remove("java.endorsed.dirs")
}
configurations {
  itestCompile.extendsFrom testCompile
  itestRuntime.extendsFrom testRuntime
}
task runFatJar(type: Test) {
    classpath = project.files( "$buildDir/fatjar.jar", configurations.runtime )
    outputs.upToDateWhen { false }
}

我的文件夹结构如下所示:

├───build
└───src
    └───test
        └───resources
            └───features

在我运行gradle runFatJar之后,它变成了这样:

├───.gradle
│   ├───5.2.1
│   │   ├───executionHistory
│   │   ├───fileChanges
│   │   ├───fileContent
│   │   ├───fileHashes
│   │   └───vcsMetadata-1
│   ├───buildOutputCleanup
│   └───vcs-1
├───build
│   └───resources
│       └───test
│           └───features
└───src
    └───test
        └───resources
            └───features

但是 gradle 输出实际上并没有做任何事情:

> gradle runFatJar --info
Initialized native services in: C:Usersderwasp.gradlenative
The client will now receive all logging from the daemon (pid: 6960). The daemon log file: C:Usersderwasp.gradledaemon5.2.1daemon-6960.out.log
Starting 3rd build in daemon [uptime: 49.78 secs, performance: 97%, no major garbage collections]
Using 8 worker leases.
Starting Build
Settings evaluated using settings file 'D:Temp!deletemesettings.gradle'.
Projects loaded. Root project using build file 'D:Temp!deletemebuild.gradle'.
Included projects: [root project '!deleteme']
> Configure project :
Evaluating root project '!deleteme' using build file 'D:Temp!deletemebuild.gradle'.
All projects evaluated.
Selected primary task 'runFatJar' from project :
Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':compileTestJava', task ':processTestResources', task ':testClasses', task ':runFatJar']
:compileJava (Thread[Execution worker for ':',5,main]) started.
> Task :compileJava NO-SOURCE
file or directory 'D:Temp!deletemesrcmainjava', not found
Skipping task ':compileJava' as it has no source files and no previous output files.
:compileJava (Thread[Execution worker for ':',5,main]) completed. Took 0.007 secs.
:processResources (Thread[Execution worker for ':',5,main]) started.
> Task :processResources NO-SOURCE
file or directory 'D:Temp!deletemesrcmainresources', not found
Skipping task ':processResources' as it has no source files and no previous output files.
:processResources (Thread[Execution worker for ':',5,main]) completed. Took 0.001 secs.
:classes (Thread[Execution worker for ':',5,main]) started.
> Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
:classes (Thread[Execution worker for ':',5,main]) completed. Took 0.0 secs.
:compileTestJava (Thread[Execution worker for ':',5,main]) started.
> Task :compileTestJava NO-SOURCE
file or directory 'D:Temp!deletemesrctestjava', not found
Skipping task ':compileTestJava' as it has no source files and no previous output files.
:compileTestJava (Thread[Execution worker for ':',5,main]) completed. Took 0.001 secs.
:processTestResources (Thread[Execution worker for ':',5,main]) started.
> Task :processTestResources UP-TO-DATE
Skipping task ':processTestResources' as it is up-to-date.
:processTestResources (Thread[Execution worker for ':',5,main]) completed. Took 0.011 secs.
:testClasses (Thread[Execution worker for ':',5,main]) started.
> Task :testClasses UP-TO-DATE
Skipping task ':testClasses' as it has no actions.
:testClasses (Thread[Execution worker for ':',5,main]) completed. Took 0.0 secs.
:runFatJar (Thread[Execution worker for ':',5,main]) started.
> Task :runFatJar NO-SOURCE
Skipping task ':runFatJar' as it has no source files and no previous output files.
:runFatJar (Thread[Execution worker for ':',5,main]) completed. Took 0.001 secs.

我什至不知道现在为什么要使用它。有没有办法在没有实际源代码文件的情况下强制启动此作业?

我花了一段时间才弄清楚,但这是最终的 gradle 文件:

apply plugin: 'java'
compileJava.options.encoding = 'UTF-8'
tasks.withType(Test) {
    systemProperties = System.getProperties()
    systemProperties.remove("java.endorsed.dirs")
}
task runBinaryTests(type: Test) {
    testClassesDirs = project.files( "$projectDir/unzipped", configurations.runtime )
    classpath = project.files( "$projectDir/fatjar.jar", configurations.runtime )
    outputs.upToDateWhen { false }
}

唯一的先决条件是在调用runBinaryTests之前执行unzip -qq fatjar.jar -d unzipped。虽然 gradle 能够处理 zip 树,但它在处理 UTF-8 方面非常糟糕,黄瓜文件名具有 UTF-8。如果有人知道如何解决这个问题,这里有一个 gradle 文件,您可以在不手动解压缩 jar 的情况下使用它:

apply plugin: 'java'
compileJava.options.encoding = 'UTF-8'
tasks.withType(Test) {
    systemProperties = System.getProperties()
    systemProperties.remove("java.endorsed.dirs")
}
task runBinaryTests(type: Test) {
    testClassesDirs += zipTree($projectDir/fatjar.jar)
    classpath = project.files( "$projectDir/fatjar.jar", configurations.runtime )
    outputs.upToDateWhen { false }
}

最新更新