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

时间:2015-04-16 01:42:33

标签: java gradle war ear

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

  1. ear ear的lib目录中的所有lib和耳内的多重战争(使用 providedCompile 声明的deps earlib
  2. 多个war 文件,其中包含在 WEB-INF / lib (使用 compile 声明的deps)的每场战争中的库
  3. 如果我每次想要不同的包装时修改build.gradle文件,我都可以执行这两项任务。 我想使用配置来选择 war 是否包含在 war 文件中,或者不使用gradle build<ConfigurationName>

    基于帮助和StackOverflow post How to use uploadConfigurationName and 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生成相等 战争,但不包括来自Common项目的jars 。 如果我将packEar的配置从providedCompile更改为compile,则会产生包含 jar 的战争。

    其他信息:我尝试使用extendFrom compile / providedCompile,但似乎没有任何影响。我添加了buildpackWarbuildpackEar方法,但它也没有用(可能是因为我以错误的方式使用了这些方法)。

    感谢您的回答!

    祝你好运, Ziga

2 个答案:

答案 0 :(得分:2)

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),shareablemywar项目中的/lib依赖项}(例如common

答案 1 :(得分:2)

使用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 {...} ,所以我可以重命名没有的战争 包含任何依赖项并具有战争名称 包含依赖项而名称未修改
  3. <强> 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. 如果未应用 publishedWar 配置,则将jar置于耳中
    2. 如果使用档案 两场战争耳朵中获取位置
    3. 如果您使用 eclipse 插件,请考虑将earlib project(path: ':ACL', configuration: 'shareable')更改为earlib project(':Common')或者您必须在eclipse中修改部署程序集( war 将被包含在 eclipse中 ear的lib 文件夹