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 >接受:*/* > 如果您希望只将一个子项目引用到shadowJar,则可以按如下方式执行

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>