0

我有一只耳朵,里面装着一些罐子,

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. 将 Ear 解压缩到 X 位置
  2. 将修补程序解压缩到位置 Y。
  3. 将 Hotfix 的内容复制到 Ear。
  4. 把耳朵拉回来。

问题- 我被困在第 3 点。我想要一些方法来找出旧版本的 jar 是否已经存在,然后删除它并复制新的。

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

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

注意- 请不要进入罐子的细节,而只是名称。

4

1 回答 1

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
于 2012-10-31T09:39:26.397 回答