通过shell脚本替换pom依赖项

时间:2018-04-06 09:29:59

标签: shell sed sh xmlstarlet

我正在阅读pom.xml并通过shell脚本提升依赖性

<dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.gwt.inject</groupId>
      <artifactId>gin</artifactId>
      <version>2.0</version>
    </dependency>

我想将guice版本提升到3.0,有没有办法可以通过shell脚本替换特定的artifactId依赖项。

所以输出应该如下

<dependency>
          <groupId>com.google.inject</groupId>
          <artifactId>guice</artifactId>
          <version>3.0</version>
        </dependency>
        <dependency>
          <groupId>com.google.gwt.inject</groupId>
          <artifactId>gin</artifactId>
          <version>2.0</version>
        </dependency>

3 个答案:

答案 0 :(得分:1)

最干净的方法(imho)是使用Properties来定义POM中依赖项的版本。例如:

<properties>
   <guice.version>2.0</guice.version>
   <gin.version>2.0</gin.version>
</properties>
...
<dependencies>
...
   <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>${guice.version}</version>
   </dependency>
   <dependency>
      <groupId>com.google.gwt.inject</groupId>
      <artifactId>gin</artifactId>
      <version>${gin.version}</version>
   </dependency>

这使得以后更容易替换特定依赖项的版本。将来,每次你需要这样做时,你都可以做一个简单的sed

sed -i 's|<guice.version>.*</guice.version>|<guice.version>3.0</guice.version>|g' pom.xml

答案 1 :(得分:1)

我看到其他人用xmlstarlet标记了你的问题。如果xmlstarlet是一个选项我不认为有任何理由选择sed或awk。

唯一可能让你失望的是POM通常有一个默认命名空间,所以你需要确保对它进行说明。

这是一个例子......

POM XML输入

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.inject</groupId>
                <artifactId>guice</artifactId>
                <version>2.0</version>
            </dependency>
            <dependency>
                <groupId>com.google.gwt.inject</groupId>
                <artifactId>gin</artifactId>
                <version>2.0</version>
            </dependency>            
        </dependencies>
    </dependencyManagement>

</project>

xmlstarlet命令行

xml ed -L -N p="http://maven.apache.org/POM/4.0.0" -u "//p:dependency[p:artifactId='guice']/p:version" -v "3.0" pom.xml

POM XML输出

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>3.0</version>
      </dependency>
      <dependency>
        <groupId>com.google.gwt.inject</groupId>
        <artifactId>gin</artifactId>
        <version>2.0</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

警告: -L将在原地编辑文件。 See here for more details.

-----更新-----

要将-SNAPSHOT添加到版本号,请使用-x(表达式)代替-v ...

xml ed -L -N p="http://maven.apache.org/POM/4.0.0" -u "//p:dependency[p:artifactId='guice']/p:version" -x "concat(normalize-space(),'-SNAPSHOT')" pom.xml

<强>输出

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>2.0-SNAPSHOT</version>
      </dependency>
      <dependency>
        <groupId>com.google.gwt.inject</groupId>
        <artifactId>gin</artifactId>
        <version>2.0</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

答案 2 :(得分:0)

以下是>>> def first_consec(A, n): ... A = np.r_[True, A, True] ... switch, = np.where(A[:-1]!=A[1:]) ... runs = switch[1::2] - switch[::2] ... idx = np.argmax(runs >= n) ... if runs[idx] < n: ... return None ... return switch[2*idx] ... >>> first_consec(w, 4) >>> first_consec(w, 3) 4 >>> first_consec(w, 2) 4 >>> first_consec(w, 1) 1 的解决方案:

sed

以下是sed -r '/<artifactId>guice<\/artifactId>/ { N; s/(<version>).*?(<\/version>)/\13.0\2/ }' pom.xml > pom_new.xml 的解决方案:

awk

这两个命令都会创建具有所需输出的新文件awk 'last ~ "<artifactId>guice</artifactId>" && $0 ~ "version" { gsub("<version>.*?</version>","<version>3.0</version>") } { last = $0 } 1;' pom.xml > pom_new.xml