修补maven神器jar的新版本

时间:2012-10-31 09:08:51

标签: java groovy jar copy

我有一个包含一些罐子的耳朵,

e.g. 
Sample.ear\WEB-INF\lib\org.apache.sling.installer.core-3.3.5-R1242752.jar
Sample.ear\WEB-INF\lib\org.apache.sling.installer.factory.configuration-1.0.2.jar
Sample.ear\WEB-INF\lib\cq-jcrclustersupport-0.1.6.jar
Sample.ear\WEB-INF\lib\com.day.jcr.vault-2.3.24.jar

现在让我说我得到一个包含以下jar的新Hotfix.zip,

Hotfix.zip\lib\org.apache.sling.installer.core-3.4.6-R12345.jar
Hotfiz.zip\lib\org.apache.sling.installer.factory.configuration-2.1.4.jar
Hotfiz.zip\lib\cq-jcrclustersupport-5.6.7.jar

任务 - 使用新罐子贴耳朵。

到目前为止,我已尝试过以下内容,

  1. 将耳朵解压缩到位置X
  2. 将修补程序解压缩到位置Y。
  3. 将修补程序的内容复制到Ear。
  4. 拉回耳朵。
  5. 问题 - 我陷入了第3点。我想找到一些方法来确定jar是否已经存在旧版本,然后将其删除并复制新版本。

    解决方案 - 我正在使用Groovy,因为它为我提供了AntBuilder()的解压缩和复制任务。但是在Java方面的任何帮助也会有所帮助。

    思考 - 我正在努力思考正则表达式,但无法找到解决方案。

    注意 - 请不要查看罐子的详细信息,只要注明名称。

1 个答案:

答案 0 :(得分:1)

这是一种快速而有点肮脏的方式......

让我们从一个类开始定义一个库:

class LibVersion implements Comparable {
  String filename
  String library
  String version

  // Just compare the String versions.
  // This is naïve, and should probably be improved
  int compareTo( Object other ) {
    version <=> other.version
  }

  String toString() {
    "$library: $version"
  }

  static fromFilename( String s ) {
    def matcher = ( s =~ $/.+/(.+?)-([0-9\.]+(?:-.+?){0,1})\.jar/$ )[0]
    new LibVersion( filename: s, library: matcher[ 1 ], version: matcher[ 2 ] )
  }
}

然后,给出一些测试数据:

def originals = [
  'Sample.ear/WEB-INF/lib/org.apache.sling.installer.core-3.3.5-R1242752.jar',
  'Sample.ear/WEB-INF/lib/org.apache.sling.installer.factory.configuration-1.0.2.jar',
  'Sample.ear/WEB-INF/lib/cq-jcrclustersupport-0.1.6.jar',
  'Sample.ear/WEB-INF/lib/com.day.jcr.vault-2.3.24.jar',
]

def replacements = [
  'Hotfix.zip/lib/org.apache.sling.installer.core-3.2.6-R12345.jar',
  'Hotfiz.zip/lib/org.apache.sling.installer.factory.configuration-2.1.4.jar',
  'Hotfiz.zip/lib/cq-jcrclustersupport-5.6.7.jar',
]

我们可以生成原始库的地图,并为替换做同样的事情:

Map<String,LibVersion> originalVersions = originals.collectEntries {
  LibVersion.fromFilename( it ).with { v ->
    [ (v.library):v ]
  }
}

Map<String,LibVersion> replacementVersions = replacements.collectEntries {
  LibVersion.fromFilename( it ).with { v ->
    [ (v.library):v ]
  }
}

然后,如果文件是新的(在原始地图中找不到)或替换版本大于原始文件

,我们可以遍历替换并打印出来
replacementVersions.each { k, v ->
  def orig = originalVersions[ k ]
  if( !orig || orig < v ) {
    println "Should replace $orig with $v"
  }
}

打印:

Should replace org.apache.sling.installer.factory.configuration: 1.0.2 with org.apache.sling.installer.factory.configuration: 2.1.4
Should replace cq-jcrclustersupport: 0.1.6 with cq-jcrclustersupport: 5.6.7