通过 shell 脚本替换 pom 依赖

Replacing pom dependency through shell script

我正在阅读 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>

最干净的方法(恕我直言)是使用 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

这是 sed 的解决方案:

sed -r '/<artifactId>guice<\/artifactId>/ { N; s/(<version>).*?(<\/version>)/.0/ }' pom.xml > pom_new.xml

这是 awk 的解决方案:

awk 'last ~ "<artifactId>guice</artifactId>" && [=11=] ~ "version" { gsub("<version>.*?</version>","<version>3.0</version>") } { last = [=11=] } 1;' pom.xml > pom_new.xml

这两个命令都将创建新文件 pom_new.xml,其中包含您想要的输出。

我看到其他人用 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>