【问题标题】:Replacing pom dependency through shell script通过shell脚本替换pom依赖
【发布时间】:2018-09-16 07:04:50
【问题描述】:

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

【问题讨论】:

  • 糟糕,您忘记发布代码了。 StackOverflow 旨在帮助人们修复他们的代码。这不是免费的编码服务。任何代码都比没有代码好。即使您不知道如何编写它,元代码甚至会展示您认为程序应该如何工作。尝试在MCVE 中向我们展示您迄今为止的工作、您期望的结果以及您得到的结果,我们将帮助您解决问题。

标签: shell sed sh xmlstarlet


【解决方案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>

【讨论】:

  • 有什么办法可以查到版本吗?任何工件并用版本快照替换版本?在 shell 脚本中
  • @Ganesh - 所以不要将 guice 的版本更改为“3.0”,而应该是“2.0-SNAPSHOT”?
  • 是的!,它已经动态识别版本并替换为-SNAPSHOT
  • @Ganesh - 你可以通过使用 -x 输出 xpath 表达式而不是静态值来做到这一点。请查看我的更新。
  • Hally 我将命令修改为 xml ed -L -N p="maven.apache.org/POM/4.0.0" -u "//*[p:artifactId='${repo_name}']/p:version" - x "concat(normalize-space(),'-SNAPSHOT')" pom.xml,因为我的 repo 名称在依赖之外,而且我的整个文件都被更改了,请检查命令
【解决方案2】:

这是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

这两个命令都会创建新文件pom_new.xml,并提供您想要的输出。

【讨论】:

  • 有什么办法可以查到版本吗?任何工件并用版本快照替换版本?在 shell 脚本中
【解决方案3】:

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

【讨论】:

  • @Zdnek 有什么方法可以找到版本吗?任何工件并用版本快照替换版本?在 shell 脚本中
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2023-04-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多