2

注:myapp-serverDropWizard アプリですが、これは厳密には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 とソース 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 を構成するにはどうすればよいですか? shadowJarmyapp-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-serverDropWizard に依存します。すべての DropWizard クラスは、この JAR 内にある必要があります。DropWizard のすべての推移的な依存関係には、この JAR 内にクラス ファイルが含まれている必要があります。

4

2 に答える 2

1

ここにあるプロジェクトをチェックアウトしました。

実行したソースを取得した後:ディレクトリgradle clean shadowJar内。myapp私が見る限り、その下myapp/myapp-server/build/distributionsに作成されたjarファイルがあり、探しているファット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
于 2015-01-05T14:56:11.230 に答える