仅在特定子项目上运行Gradle ShadowJar插件

时间:2015-01-01 10:44:07

标签: groovy gradle dropwizard gradle-plugin

请注意:即使我的myapp-serverDropWizard 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源代码,运行单元测试,生成GroovyDocs,并为所有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配置为仅在shadowJar子项目上运行myapp-server任务,而不是在其他任何项目上运行?理想情况下,我可以我的构建调用是这样的:

gradle clean build groovyDoc sourceJar shadowJar -Pversion=<blah>

然后以某种方式将Gradle配置为忽略在除{/ em> 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中的所有类(它应该是“胖子JAR”)。例如,myapp-server取决于DropWizard。所有DropWizard类都应该在这个JAR中。所有DropWizard的传递依赖都应该在这个JAR等中包含类文件。

2 个答案:

答案 0 :(得分:1)

我刚刚检查了位于here的项目。

获取源后,我在gradle clean shadowJar目录中运行:myapp。据我所知,在myapp/myapp-server/build/distributions下创建了一个jar文件,它看起来像是你正在寻找的 fat <​​/ em> jar(同时也考虑了文件大小)。进入提到的分发目录并运行java -jar myapp-server.jar后,服务器就会启动。它似乎一切正常。我是对的吗?

同时运行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

答案 1 :(得分:0)

如果您只想将一个子项目引用到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。按绝对路径运行任务