2

请注意:即使我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 中包含类文件,等等。

4

2 回答 2

1

我刚刚检查了位于此处的项目。

获取我运行的源代码后:gradle clean shadowJarmyapp目录中。据我所见,有一个 jar 文件在您正在寻找myapp/myapp-server/build/distributionsjar 下创建(也考虑到文件大小)。进入上述发行版目录并运行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
于 2015-01-05T14:56:11.230 回答
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。按绝对路径运行任务

于 2015-01-08T06:40:42.470 回答