これは、これを行うための迅速でちょっと汚い方法です...
ライブラリを定義するクラスから始めましょう。
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