【问题标题】:gradle build<ConfigurationName>: different packaging for ear and war (gradle v2.3)gradle build<ConfigurationName>:ear 和 war 的不同封装(gradle v2.3)
【发布时间】:2015-04-16 01:42:32
【问题描述】:

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

  1. ear 包含 ear 的 lib 目录 中的所有库和 ear 内的多重战争(使用 providedCompileearlib 声明的 deps)
  2. WEB-INF/lib 中的 multiple war 文件,每个 war 中都包含库(deps 用 compile 声明)

如果我每次想要不同的打包时都修改 build.gradle 文件,我可以执行这两项任务中的每一项。 我想使用 configurations 来选择 jars 是否包含在 war 文件中,方法是使用gradle build&lt;ConfigurationName&gt;

根据帮助和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 产生 equal wars 不包括 jars 来自Common 项目。 如果我将 packEar 的配置从 providedCompile 更改为 compile 两者都会产生包含 jars 的战争。

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

感谢您的回答!

最好的问候, 齐加

【问题讨论】:

    标签: java gradle war ear


    【解决方案1】:

    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项目下mywar下的shareable的依赖项(如common

    【讨论】:

      【解决方案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 {...} 这样我就可以重命名没有 包含任何依赖项并具有战争的名称 包含在其名称中没有修改的依赖项

      耳朵

      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 放在 ear 中
      2. 如果使用档案两场战争ear中获得位置
      3. 如果您使用 eclipse 插件,请考虑将 earlib project(path: ':ACL', configuration: 'shareable') 更改为 earlib project(':Common') 否则您将不得不在 eclipse 中修改部署程序集(war 将包含在 eclipse 中 em>ear 的 lib 文件夹

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 1970-01-01
        • 2014-07-01
        • 2011-10-20
        • 1970-01-01
        • 2020-09-01
        • 2021-02-21
        • 2015-05-06
        • 2017-11-24
        相关资源
        最近更新 更多