[英]How to build a jar from a multi-module project when using Gradle?
我正在使用 Gradle 構建一個多模塊庫項目。 在我的dependencies
部分,我dependencies
於這個項目的另一個模塊:
dependencies {
compile project(':my-other-module')
}
我的問題是我想構建一個.jar
文件,它只包含最終文件中的本地模塊,而不是它的傳遞依賴項。 我試過這個:
jar {
from project(':my-other-module').configurations.compile.collect { zipTree it }
}
但這也添加了所有傳遞依賴項。 我想創建一個只包含我自己的文件的.jar
,所以這個庫的用戶可以擁有他們自己版本的傳遞依賴項。 我怎么能這樣做?
進一步澄清:
我在我的項目中聲明了對外部 jars 的依賴,比如apache-commons
。 我希望這些不在我生成的.jar
文件中,但我希望我的庫的用戶能夠將我的庫添加為依賴項,並讓Maven
/ Gradle
下載傳遞依賴項。 我不希望這些傳遞依賴是在.jar
文件I部署到Maven的中央。 compileOnly
不是一個選項,因為我使用的依賴項如apache-commons
不是由框架或容器提供的。 它們需要作為compile
依賴項出現。 我只想構建和部署一個.jar
文件,該文件包含我的項目中具有多個模塊的所有文件。
Gradle 有一個compile-only 依賴概念,類似於 Maven 提供的范圍:
僅編譯依賴項與常規編譯依賴項明顯不同。 它們不包含在運行時類路徑中,並且它們是不可傳遞的,這意味着它們不包含在依賴項目中。
您不需要的依賴項可以在 compileOnly 配置中聲明,而不是編譯,例如:
dependencies { compileOnly 'javax.servlet:servlet-api:2.5' }
默認情況下, compileOnly
甚至對單元測試不可見。 我們在每個構建中都包含的通用 gradle 片段中對此進行了更改:
// compileOnly isn't visible to tests by default, add it
plugins.withType(JavaPlugin).whenPluginAdded {
sourceSets {
test.compileClasspath += configurations.compileOnly
test.runtimeClasspath += configurations.compileOnly
}
}
對於第二部分,我相信您想為其創建一個“胖”jar,我建議您使用非常好的Shadow Plugin創建您的 jar,而不是手動擴展 jar 任務。 默認情況下,影子插件不會在生成的 jar 中的compileOnly
配置中包含任何內容。
我不確定它是否會幫助你,但你可以試試這個。
在您的 build.gradle 文件中,按如下方式自定義您的 jar 任務:
// This closure will return the full directory path of folder where your classes are built
ext.moduleClassPath = { moduleName ->
def classOutputDirConst = "/classes/java/main"
return "${project(":${moduleName}").buildDir}${classOutputDirConst}"
}
// Now jar task will include only the built file of specified project
jar {
from(moduleClassPath("projectName1"), moduleClassPath("projectName2"))
}
在此處檢查 from(SourcePaths) 方法的參考:參考: https: //docs.gradle.org/current/dsl/org.gradle.jvm.tasks.Jar.html#org.gradle.jvm.tasks.Jar :從(java.lang.Object[])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.