2015-01-01 68 views
2

請注意:雖然我myapp-serverDropWizard app,這是嚴格意義上的搖籃問題;我只提到DropWizard的好處。只在特定的子項目運行搖籃ShadowJar插件

我有我有搖籃建設多項目構建:

myapp/ 
    myapp-client/ 
    myapp-shared/ 
    myapp-server/ 
    build.gradle 
    settings.gradle 

settings.gradle樣子:

include ':myapp-shared' 
include ':myapp-client' 
include ':myapp-server' 

我已經成功地得到了搖籃編譯我的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 
} 

我的問題:如何配置搖籃僅在我myapp-server子項目運行shadowJar任務,而不是任何其他人?理想情況下,我可以有我的生成調用是這樣的:

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

然後以某種方式配置搖籃無視一切運行shadowJar除了myapp-server。想法?


更新

當我運行gradle clean build groovyDoc sourceJar shadowJar -Pversion=0.1.3我看到結尾搖籃輸出的一串:

: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裏面有類文件,等等。

+0

據我瞭解'陰影'被添加到'myapp-server'?從根目錄運行'gradle clean build groovyDoc sourceJar shadowJar -Pversion = '的結果是什麼? – Opal

+0

謝謝@Opal(如果我有代表這樣做,我會贊成你),請參閱我的更新,它會回答你的問題。有什麼想法嗎? – smeeb

+0

該項目是否在線?我可以試試嗎? – Opal

回答

1

我剛剛檢出了位於here的項目。

獲取我已運行的源代碼後:gradle clean shadowJarmyapp目錄中。據我所知,有一個jar文件在myapp/myapp-server/build/distributions下創建,它將被視爲fat 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 
+0

感謝@Opal(+1) - 你怎麼知道在'build/distributions'目錄中查找?這似乎沒有被記錄在Shadow Jar插件GitHub文檔中的任何地方... – smeeb

+1

這是正在構建分發工件的位置。我也運行'gradle clean shadowJar'並調查了所有創建的罐子。看起來您可以更改位置以及構建工件的名稱。如果清楚並且有效,請接受。 – Opal

+0

再次感謝@Opal(+1) - 我不想在這裏變得困難,只是試圖學習,這樣我就不必在將來問這些類型的問題。當你說「這是分佈神器正在構建的位置」時,這是一個Gradle約定,暗影罐只是從背後捎帶而來?或者,如果我已經閱讀了Shadow Jar文檔,這些*應該*對我來說顯而易見?我猜這個問題的根源在於我只是在錯誤的地方尋找脂肪JAR。我試圖理解*爲什麼*我在錯誤的地方看,其原因是: – smeeb