java - Gradle ear 用当前 WAR 文件名更新 application.xml

标签 java gradle war ear application.xml

我有一个包含一些 WAR 网络应用程序的 java EAR 项目。

我正在使用 gradle 构建 EAR 文件。

uberApp
|
\---> WarA
|     |
|     ...<src and config>
|
\---> WarB
|     |
|     ...<src and config>
|
\--> config/META-INF/application.xml

这是 uberApp build.gradle:

apply plugin: 'ear'


dependencies {
    deploy project(path: ':WarA/trunk', configuration: 'archives')
    deploy project(path: ':WarB/trunk', configuration: 'archives')

}

ear {
    appDirName 'config'
}

这是 WAR build.gradle:

war {
    baseName = 'WarA'
    version = '1.2.3_rev'  + getSvnRevision() // provided by SvnKit
}

...因此生成的文件名始终包含手写版本号和 SVN 提交号:WarA-1.2.3_rev31337.war

但在组装 EAR 之前,我需要在标记内使用正确的 WAR 文件名更新我的 application.xml

这是 EAR application.xml:

<?xml version="1.0"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6">
  <module>
    <web>
      <web-uri>WarA.war</web-uri>
      <context-root>/WarA</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>WarB.war</web-uri>
      <context-root>/WarB</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

我怎样才能做到这一点?

最佳答案

可能有更好的方法,但我实现了我的目标,即编写一个 groovy 函数来在 ear 构建期间完成这项工作。

这是我的完整build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // SvnKit from https://gist.github.com/thombergs/9279728
        classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.14'
    }
}


// SvnKit get svn revision
import org.tmatesoft.svn.core.wc.*
def getSvnRevision(){
        ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
        SVNClientManager clientManager = SVNClientManager.newInstance(options);
        SVNStatusClient statusClient = clientManager.getStatusClient();
        SVNStatus status = statusClient.doStatus(projectDir, false);
        SVNRevision revision = status.getRevision();
        return revision.getNumber();
        }




// extract from file
def extractfromfile(source, pattern) {
  (source.text =~ pattern) [0]
}

// extract from string
def extract(source, pattern) {
  (source =~ pattern) [0]
}

// replace
def ReplaceText(source, targetText, replaceText){
  source.write(source.text.replaceAll(targetText, replaceText))
}


def updateApplicationXml() {
  def applicationXml = new File('config/META-INF/application.xml')
  def settingsGradle = new File('settings.gradle')
  def prjRegex = "'(.*)'"
  def prj =  settingsGradle.text.split(',')



  //for every project
  List<String> list = new ArrayList<String>(Arrays.asList(prj))

  for(String item: list){

    def prjPath = extract(item, prjRegex)[1]
    //println prjPath


    //search for build.gradle
    def buildGradle = new File(prjPath+'/build.gradle')
    def basenamePattern = "baseName = '(.*)'"
    def versionPattern = "version = '(.*)'"

    //extract basename
    def basename
    try {
      basename = extractfromfile(buildGradle, basenamePattern)
    } catch (Exception ex){
        continue
    }

    //extract version
    def version
    try {
      version = extractfromfile(buildGradle, versionPattern)
    } catch (Exception ex){
        continue
    }

    def warname = basename[1] + "-" + version[1] + getSvnRevision()

  //  println basename[1]
  //  println version[1]
  //  println warname
  //  println applicationXml


    // do the replace
    ReplaceText(applicationXml, "<web-uri>"+basename[1]+"(.*).war</web-uri>", "<web-uri>"+warname+".war</web-uri>")

  }
}

apply plugin: 'ear'

dependencies {
    deploy project(path: ':WarA/trunk', configuration: 'archives')
    deploy project(path: ':WarB/trunk', configuration: 'archives')

}



ear {
    updateApplicationXml()
    appDirName 'config'
}

关于java - Gradle ear 用当前 WAR 文件名更新 application.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735648/

相关文章:

java - Files.createDirectories() 抛出 FileAlreadyExistsExceptions 但没有目录

java - AWS 无法验证提供的访问凭证(eclipse)

java - Eclipse文本编辑器获取光标位置

java - Gradle 未下载测试依赖项

java - 将二进制数据插入 MySQL(没有 PreparedStatement)

gradle - 为多模块 gradle 项目创建单个源 jar

maven - 运行gradle时如何覆盖Maven的URL

java - WAR 类访问其他 WAR 中的另一个类

java - 访问与主代码不同的 JAR 文件中的资源

Jsf 在 Apache Karaf 3.0.3 中的应用