请注意:即使我myapp-server
是一个DropWizard 应用程序,这也只是一个Gradle问题;我只提到 DropWizard 是为了很好的衡量标准。
我有一个使用 Gradle 构建的多项目构建:
myapp/
myapp-client/
myapp-shared/
myapp-server/
build.gradle
settings.gradle
哪里settings.gradle
看起来像:
include ':myapp-shared'
include ':myapp-client'
include ':myapp-server'
我已成功让 Gradle 编译我的 Groovy 源代码、运行单元测试、生成 GroovyDocs,并为所有 3 个子项目打包二进制和源 JAR。其构建调用是:gradle clean build groovydoc sourcesJar -Pversion=<whatever version I specify>
.
这myapp-server
实际上是我需要在其上运行Shadow JAR 插件的项目,通常通过gradle clean build shadowJar
.
这是我的myapp-server/build.gradle
:
import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer
apply plugin: 'application'
apply plugin: 'shadow'
mainClassName = 'com.me.myapp.server.MyAppServer'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:0.8'
}
}
dependencies {
compile project(':myapp-shared')
compile (
'io.dropwizard:dropwizard-core:0.7.1'
)
}
shadow {
outputFile new File(destinationDir, "${outputJarBaseName}.${extension}")
transformer(ServiceFileTransformer)
exclude 'META-INF/*.DSA'
exclude 'META-INF/*.RSA'
}
jar {
manifest {
attributes 'Main-Class': mainClassName
}
}
run {
args 'server', 'config.json'
if (System.getProperty('debug', 'false') == 'true') {
jvmArgs '-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005'
}
}
artifacts {
shadowJar
}
我的问题:如何将 Gradle 配置为仅shadowJar
在我的子项目上运行任务myapp-server
,而不是在其他任何项目上运行?理想情况下,我可以让我的构建调用类似于:
gradle clean build groovyDoc sourceJar shadowJar -Pversion=<blah>
然后以某种方式将 Gradle 配置为忽略shadowJar
除. 想法? myapp-server
更新
当我运行时,gradle clean build groovyDoc sourceJar shadowJar -Pversion=0.1.3
我看到一堆以以下结尾的 Gradle 输出:
:myapp-shared:groovydoc
:myapp-client:sourcesJar
:myapp-server:sourcesJar
:myapp-shared:sourcesJar
:myapp-server:copySignedLibs UP-TO-DATE
:myapp-server:shadowJar
BUILD SUCCESSFUL
Total time: 16.315 secs
但是,当我深入myapp-server/build/libs/myapp-server-0.1.3.jar
并打开它(像 ZIP 一样提取它)时,我只看到我在其中编译的类,而不是它所有依赖 JAR 中的所有类(它应该是一个“Fat JAR”)。例如,myapp-server
依赖于 DropWizard。所有 DropWizard 类都应该在这个 JAR 中。DropWizard 的所有传递依赖项都应该在这个 JAR 中包含类文件,等等。