我的耳朵包含一些罐子,
e.g.
Sample.earWEB-INFliborg.apache.sling.installer.core-3.3.5-R1242752.jar
Sample.earWEB-INFliborg.apache.sling.installer.factory.configuration-1.0.2.jar
Sample.earWEB-INFlibcq-jcrclustersupport-0.1.6.jar
Sample.earWEB-INFlibcom.day.jcr.vault-2.3.24.jar
现在说我得到一个新的hotfix.zip,其中包含以下罐子,
Hotfix.zipliborg.apache.sling.installer.core-3.4.6-R12345.jar
Hotfiz.zipliborg.apache.sling.installer.factory.configuration-2.1.4.jar
Hotfiz.ziplibcq-jcrclustersupport-5.6.7.jar
任务 - 用新的罐子修补耳朵。
我已经尝试了以下内容,
- 将耳朵拉开到位置x
- 将热五十封面解压缩到一个位置y。
- 将Hotfix的内容复制到Ear。
- 将耳朵拉回。
问题 - 我陷入了点3。我希望某种方法找出jar是否已经存在较旧版本,然后删除并复制新版本。
解决方案 - 我正在使用Groovy,因为它为我提供了antbuilder()的UNZIP和复制任务。但是在Java方面的任何帮助也将有所帮助。
思想 - 我正在努力用Regex思考,但无法找到解决方案。
注意 - 请不要介绍罐子的详细信息,而只是名称。
这是一种快速而有点肮脏的方法...
让我们从一类定义库:
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