簡體   English   中英

修補Maven神器jar的新版本

[英]Patching a new version of maven artifact jar

我的耳朵里有一些罐子,

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

現在說我得到一個新的Hotfix.zip,其中包含以下jar,

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. 將耳朵向后拉。

問題 -我停留在第3點。我想找到一種方法來確定jar是否已存在較舊的版本,然后將其刪除並復制新的jar。

解決方案 -我使用Groovy是因為它為我提供了AntBuilder()的解壓縮和復制任務。 但是,任何有關Java的幫助也將有所幫助。

思想 -我正努力就正則表達式進行思考,但找不到解決方案。

注意 -請不要進入罐子的詳細信息,而只是名字。

這是一種快速且有點臟的方法...

讓我們從一個類開始定義一個庫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM