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. Hotfix を場所 Y に解凍します。
  3. Hotfix の内容を Ear にコピーします。
  4. 耳を後ろに締めます。

問題- ポイント 3 で行き詰まっています。古いバージョンの jar が既に存在するかどうかを確認し、それを削除して新しいバージョンをコピーする方法が必要です。

解決策- AntBuilder() の unzip およびコピー タスクが提供されるため、Groovy を使用しています。しかし、Java に関するヘルプも役に立ちます。

考え- 正規表現の観点から一生懸命考えようとしていますが、解決策がわかりません。

- jar の詳細には触れずに、名前だけを調べてください。

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 に答える