簡體   English   中英

Gradle構建 <ConfigurationName> :針對耳朵和戰爭的不同包裝(等級v2.3)

[英]gradle build<ConfigurationName>: different packaging for ear and war (gradle v2.3)

我想使用gradle v2.3配置以兩種方式打包我的應用程序:

  1. 內耳耳的lib目錄和multipe戰爭的所有庫(聲明的providedCompile和DEPS earlib)
  2. WEB-INF / lib的每個戰爭中都包含多個帶有lib的戰爭文件(通過compile聲明的deps)

如果每次我想要不同的包裝時都修改build.gradle文件,則可以執行這兩項任務中的每一項。 我想使用配置來選擇是否通過使用gradle build<ConfigurationName> jar包含在war文件中。

基於幫助和StackOverflow帖子如何使用uploadConfigurationName和buildConfigurationName我組成了以下文件(這是一場戰爭):

apply plugin: 'war'

configurations {
        packEar
        packWar
    }

dependencies {
    configurations.packEar {
        providedCompile project(':Common') // jars will be included using earlib
    }

    configurations.packWar {
        compile project(':Common') // jars included in war
    }
}

artifacts {
        packWar war
        packEar war
}

問題在於gradle buildpackWargradle buildpackEar命令gradle buildpackWar產生相等的 戰爭 ,不包含Common項目中的jar 如果我從providerCompile更改packEar的providedCompile以進行compile兩者都將與jar產生戰爭。

附加信息:我嘗試使用extendFrom compile / providedCompile但似乎沒有影響任何事情。 我包括了buildpackWarbuildpackEar方法,但是它們也不起作用(可能是因為我以錯誤的方式使用了它們)。

謝謝您的回答!

最好的問候,Ziga

compileprovidedCompile是自己的配置,所以你要添加的通用項目的,而不是packWarpackEar配置。 這樣的事情應該起作用:

mywar項目

apply plugin: 'war'
apply plugin: 'java'

repositories {
    jcenter()
}

configurations {
    shareable
}

dependencies {
    shareable project(':common')
}

task standaloneWar(type: War, dependsOn: war) {
    baseName = war.baseName + '-standalone'
    classpath = war.classpath + configurations.shareable
}

artifacts {
    archives standaloneWar
}

myear項目

apply plugin: 'ear'
apply plugin: 'java'

evaluationDependsOn ':mywar'

repositories {
    jcenter()
}

dependencies {
    deploy project(':mywar')
    earlib project(path: ':mywar', configuration: 'shareable')
}

它將產生三個主要工件:

  • mywar.war ,它不包含shareable任何依賴項(如common
  • mywar-standalone.war ,其中包含shareable依賴項
  • myear.ear ,它在根目錄中包含mywar.war (技術上為mywar.jar ),並在/lib下的mywar項目中shareable的依賴項(例如common

使用Ben Navetta提供的信息,我設法產生了一個可行的配置,只需要進行少量調整即可。 這是文件

ACL戰爭

apply plugin: 'war'

apply plugin: 'eclipse-wtp'

configurations {
    shareable
    publishedWar // need this so war gets placed in ear instead of jar, 
                 // using archives puts both wars in ear
}

dependencies {
    providedCompile project(':Common');
    shareable project(':Common');
}

war {
    baseName = war.baseName + '-thin'
    classpath = war.classpath
}

task standaloneWar(type: War, dependsOn: war) {
    baseName = project.name  // sharable war's name without modifications
    classpath = war.classpath + configurations.shareable
}

artifacts {
    archives standaloneWar
    publishedWar war // to be included in ear
}   

注意:

  1. 如果providedCompile project(':Common'); 被省略,這將不會編譯
  2. 我添加了war {...},因此我可以重命名不包含任何依賴項的war,並命名為war的名稱,其中包含不需對其名稱進行任何修改的依賴項

apply plugin: 'ear'

evaluationDependsOn ':ACL' // probably not needed

dependencies {
    deploy project(path: ':ACL', configuration: 'publishedWar')
    earlib project(path: ':ACL', configuration: 'shareable')
}  

ear {
    deploymentDescriptor {  
        webModule ('ACL-thin.war', "${project.name}/ACL") // set context root        
    }
} 

注意:

  1. 如果未發布戰爭配置,則將jar放在耳朵中
  2. 如果檔案被用於兩場戰爭得到耳朵的地方
  3. 如果您使用eclipse插件,請考慮將earlib project(path: ':ACL', configuration: 'shareable')更改為earlib project(':Common')否則您將不得不修改eclipse中的部署程序集( 戰爭將包含在其中) Eclipse中 Ear的lib文件夾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM