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