Groovy 仅在特定子项目上运行Gradle ShadowJar插件
请注意:尽管我的Groovy 仅在特定子项目上运行Gradle ShadowJar插件,groovy,gradle,dropwizard,gradle-plugin,Groovy,Gradle,Dropwizard,Gradle Plugin,请注意:尽管我的myapp服务器是一个问题,但这严格来说是一个渐变问题;我提到DropWizard只是出于善意 我正在与Gradle一起构建一个多项目构建: myapp/ myapp-client/ myapp-shared/ myapp-server/ build.gradle settings.gradle 其中settings.gradle看起来像: include ':myapp-shared' include ':myapp-client' i
myapp服务器
是一个问题,但这严格来说是一个渐变问题;我提到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=
myapp服务器
实际上是一个我需要在其上运行的项目,它通常通过gradle clean build shadowJar
执行
这是我的myapp服务器/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>
然而,当我深入到
myapp-server/build/libs/myapp-server-0.1.3.jar
并打开它(像ZIP一样提取它)时,我只看到它里面的编译类,而不是它所有依赖jar的所有类(它应该是一个“胖jar”)。例如,myappserver
依赖于DropWizard。所有DropWizard类都应该在这个JAR中。DropWizard的所有可传递依赖项都应该在这个JAR中包含类文件,等等。我刚刚签出了找到的项目
获取我运行的源代码后:gradlecleanshadowjar
位于myapp
目录中。据我所见,在myapp/myapp server/build/distributions
下创建了一个jar文件,它看起来就是您要寻找的胖jar(考虑到文件大小时也是如此)。进入上述分发目录并运行java-jarmyappserver.jar
后,服务器启动。看来一切都很顺利。我说得对吗
同时运行curl-v-xgethttp://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
在DNS缓存中找不到主机名
*正在尝试::1。。。
*已连接到本地主机(::1)端口8080(#0)
>GET/myapp/dosomething HTTP/1.1
>用户代理:curl/7.37.1
>主机:本地主机:8080
>接受:*/*
>
gradle clean build groovyDoc sourceJar :myapp-server:shadowJar -Pversion=<1.0>
gradle clean build groovyDoc sourceJar:myapp服务器:shadowJar-Pversion=
您可以通过:
参考:
57.4. 按绝对路径运行任务据我所知,
shadow
已添加到myapp服务器
?从root运行gradle clean build groovyDoc sourceJar shadowJar-Pversion=
的结果是什么?谢谢@Opal(如果我有代表的话,我会投票给你),请查看我的更新,它回答了你的问题。有什么想法吗?那个项目在网上吗?我可以试一试吗?不@Opal这只是我机器的本地版本。真遗憾。你能举一个github的例子吗?谢谢@Opal(+1)-你怎么知道在构建/分发
目录中查找?在shadowjar插件GitHub doc中似乎没有记录到这一点……这是构建分发工件的位置。我还运行了gradlecleanshadowjar
并调查了所有创建的jar。似乎您可以更改构建工件的位置和名称。如果它清晰有效,请接受。再次感谢@Opal(+1)-我在这里并不是想变得困难,只是想学习,这样我以后就不必问这些类型的问题。当您说“这是构建分发工件的位置”时,这是Shadow Jar简单借鉴的Gradle约定吗?或者,如果我读过Shadow Jar文档,这对我来说应该是显而易见的吗?我想问题的根源在于我只是在错误的地方寻找脂肪罐。我试图理解为什么我找错了地方,这可能是因为:(a)Shadow Jar利用了我不知道的Gradle约定(在这种情况下,我需要更多地阅读Gradle文档),或者(b)Shaodw Jar使用自己的约定将胖Jar放在构建/分发
下。如果是这样的话,那么在他们的网站上有记录吗?我认为这只是一个经验问题。Gradle应用程序
插件构建在发行版
插件之上。我用过那个插件,所以我记得关于分发文件夹的事。说到shadow
插件,我在文档中读到它可以与应用程序插件集成,这就是我如何找到开始搜索的地方。我立刻发现了事实。相信我,这里没有魔法。随着时间的推移,你会变得更有经验,也会知道它是如何工作的。我可以告诉你,你准备的gradle脚本看起来非常好。
gradle clean build groovyDoc sourceJar :myapp-server:shadowJar -Pversion=<1.0>