Java 修补maven artifact jar的新版本

Java 修补maven artifact jar的新版本,java,groovy,jar,copy,Java,Groovy,Jar,Copy,我的耳朵里有一些罐子 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\

我的耳朵里有一些罐子

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
任务-用新罐子贴耳朵

到目前为止,我已经尝试了以下方法:

  • 将Ear解压缩到位置X
  • 将修补程序解压缩到位置Y
  • 将修补程序的内容复制到Ear
  • 把耳朵拉回来
  • 问题-我被困在第3点。我想用某种方法来找出这个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 ] )
      }
    }
    
    我们可以生成原始库的映射,并对替换库执行相同的操作:

    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 ]
      }
    }
    

    非常感谢蒂姆。这真是太棒了,我从中学到了很多。我现在必须检查compareTo(…)是否适用于我所有的罐子。我已经掌握了方向,如果它失败了,我可以把它修好。再次感谢!!
    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