gradle build<ConfigurationName>: ear 和 war 的不同包装 (gradle v2.3)

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

我想使用 gradle v2.3 配置以两种方式打包我的应用程序:

  1. ear 所有库都在 ear 的 lib 目录 和 multipe wars inside ear (deps declared with 提供编译earlib)
  2. 多个 war 文件,每个 war 在 WEB-INF/lib 中包含库(deps用 compile)
  3. 声明

如果每次我想要不同的包装时修改 build.gradle 文件,我就可以执行这两项任务中的每一项。 我想使用 configurations 来选择 jars 是否包含在 war 文件中或不是通过使用 gradle build<ConfigurationName>.

根据帮助和 Whosebug post How to use uploadConfigurationName and buildConfigurationName 我编写了以下文件(这是 war 之一):

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产生相等wars 不包括来自 Common 项目的 jars。 如果我将 packEar 的配置从 providedCompile 更改为 compile,两者都会生成 war,其中包含 jars。

附加信息: 我尝试使用 extendFrom compile / providedCompile 但似乎没有任何影响。我包括了 buildpackWarbuildpackEar 方法,但它也不起作用(可能是我以错误的方式使用了它们)。

感谢您的回答!

此致, 齐加

compileprovidedCompile 是它们自己的配置,因此您要将 Common 项目添加到它们,而不是 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)和 mywar 项目中 shareable 的依赖项 /lib(如common

使用 Ben Navetta 提供的信息,我设法生成了一个可用的配置,它只需要进行一些小的调整。这是文件

ACL war

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 的名称 包含名称未修改的依赖项

EAR

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. if publishedWar 配置没有应用 jar 放在 ear
  2. 如果使用 archives both warsear 中获得位置
  3. 如果您使用 eclipse 插件,请考虑将 earlib project(path: ':ACL', configuration: 'shareable') 更改为 earlib project(':Common') 否则您将不得不修改 eclipse 中的部署程序集(war 将包含在 ear 的 lib 文件夹中 eclipse