java - 如何在没有源文件但使用胖 jar 的情况下运行 gradle JUnit 测试作业?
问题描述
我对 JVM 世界很陌生,不知道如何解决以下问题:
我有一个 gradle 项目,它创建一个测试 uber jar(使用shadowJar插件构建),并将 JUnit 测试作为其输出。我可以使用这样的东西在同一个项目中运行这个 uber jar:
task runFatJar(type: Test) {
dependsOn shadowJar
classpath = project.files( "$buildDir/libs/fatjar.jar", configurations.runtime )
outputs.upToDateWhen { false }
}
然而,我想要的是创建一个非常小的gradle.build
文件来运行与预先构建的 jar 相同的作业。详细说明一下:我有一个创建这个胖 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:\Users\derwasp\.gradle\native
The client will now receive all logging from the daemon (pid: 6960). The daemon log file: C:\Users\derwasp\.gradle\daemon\5.2.1\daemon-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\!deleteme\settings.gradle'.
Projects loaded. Root project using build file 'D:\Temp\!deleteme\build.gradle'.
Included projects: [root project '!deleteme']
> Configure project :
Evaluating root project '!deleteme' using build file 'D:\Temp\!deleteme\build.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\!deleteme\src\main\java', 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\!deleteme\src\main\resources', 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\!deleteme\src\test\java', 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 }
}
unzip -qq fatjar.jar -d unzipped
唯一的先决条件是在调用之前做一个正确的操作runBinaryTests
。尽管 gradle 能够使用 zip 树,但它在处理黄瓜文件名所具有的 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 }
}
推荐阅读
- angular - RxJs, Angular4+
- memory-address - 为什么将数据填充到缓冲区中从低地址到高地址
- android-mediarecorder - MediaRecorder:java.lang.IllegalStateException 在
- c# - 无法将 XElement 转换为 XObject
- reactjs - onChangeText 在 ReactJS 和 ReactNative 中工作
- android - Opencv 和 Tensorflow 在一个 Android 项目中不起作用
- spring-boot - 如何在 application.yml 中为 SpringBoot 启用 h2 控制台?
- sql - SQL 服务器约束数据
- postgresql-9.3 - pg_restore 正在进行时如何防止 postgres 数据库写入?
- docker - 强制重启 OpenShift 中的 pod