仅在特定子项目上运行 Gradle ShadowJar 插件
Running Gradle ShadowJar Plugin only on specific subproject
请注意: 虽然我的 myapp-server
是 DropWizard app,但这严格来说是 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 源代码,运行单元测试,生成 Groovy 文档,并为所有 3 个子项目打包二进制和源 JAR。其构建调用是:gradle clean build groovydoc sourcesJar -Pversion=<whatever version I specify>
.
myapp-server
实际上是我需要运行Shadow JAR plugin的项目,通常通过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 只在我的 myapp-server
子项目上运行 shadowJar
任务,而不在其他任何子项目上运行? 理想情况下,我可以让我的构建调用类似于:
gradle clean build groovyDoc sourceJar shadowJar -Pversion=<blah>
然后以某种方式配置 Gradle 以忽略在所有 除了 myapp-server
上运行 shadowJar
。想法?
更新
当我运行 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 一样解压)时,我只看到里面编译的 classes,而不是所有 class来自其所有依赖 JAR 的 es(它应该是 "Fat JAR")。例如,myapp-server
依赖于 DropWizard。所有 DropWizard classes 都应该在这个 JAR 中。所有 DropWizard 的传递依赖项都应在此 JAR 中包含 class 个文件,等等
我刚刚查看了位于 here 的项目。
获取资源后,我 运行: gradle clean shadowJar
在 myapp
目录中。据我所知,在 myapp/myapp-server/build/distributions
下创建了一个 jar 文件,它似乎是您正在寻找的 fat jar(也考虑了文件大小) .进入上述分发目录并 运行ning java -jar myapp-server.jar
服务器启动后。似乎一切正常。我说得对吗?
另外 运行ning curl -v -X GET http://localhost:8080/myapp/dosomething
给出以下输出:
* Hostname was NOT found in DNS cache
* Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /myapp/dosomething HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 05 Jan 2015 14:59:50 GMT
< Content-Type: application/json
< Content-Length: 0
<
* Connection #0 to host localhost left intact
如果您只想将一个子项目引用到 shadowJar,您可以按如下方式进行。
gradle clean build groovyDoc sourceJar :myapp-server:shadowJar -Pversion=<1.0>
您可以通过 :<project name>:<task name>
深入了解您的子项目任务
参考:
https://gradle.org/docs/current/userguide/multi_project_builds.html
57.4。 运行 任务的绝对路径
请注意: 虽然我的 myapp-server
是 DropWizard app,但这严格来说是 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 源代码,运行单元测试,生成 Groovy 文档,并为所有 3 个子项目打包二进制和源 JAR。其构建调用是:gradle clean build groovydoc sourcesJar -Pversion=<whatever version I specify>
.
myapp-server
实际上是我需要运行Shadow JAR plugin的项目,通常通过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 只在我的 myapp-server
子项目上运行 shadowJar
任务,而不在其他任何子项目上运行? 理想情况下,我可以让我的构建调用类似于:
gradle clean build groovyDoc sourceJar shadowJar -Pversion=<blah>
然后以某种方式配置 Gradle 以忽略在所有 除了 myapp-server
上运行 shadowJar
。想法?
更新
当我运行 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 一样解压)时,我只看到里面编译的 classes,而不是所有 class来自其所有依赖 JAR 的 es(它应该是 "Fat JAR")。例如,myapp-server
依赖于 DropWizard。所有 DropWizard classes 都应该在这个 JAR 中。所有 DropWizard 的传递依赖项都应在此 JAR 中包含 class 个文件,等等
我刚刚查看了位于 here 的项目。
获取资源后,我 运行: gradle clean shadowJar
在 myapp
目录中。据我所知,在 myapp/myapp-server/build/distributions
下创建了一个 jar 文件,它似乎是您正在寻找的 fat jar(也考虑了文件大小) .进入上述分发目录并 运行ning java -jar myapp-server.jar
服务器启动后。似乎一切正常。我说得对吗?
另外 运行ning curl -v -X GET http://localhost:8080/myapp/dosomething
给出以下输出:
* Hostname was NOT found in DNS cache
* Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /myapp/dosomething HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 05 Jan 2015 14:59:50 GMT
< Content-Type: application/json
< Content-Length: 0
<
* Connection #0 to host localhost left intact
如果您只想将一个子项目引用到 shadowJar,您可以按如下方式进行。
gradle clean build groovyDoc sourceJar :myapp-server:shadowJar -Pversion=<1.0>
您可以通过 :<project name>:<task name>
参考: https://gradle.org/docs/current/userguide/multi_project_builds.html 57.4。 运行 任务的绝对路径