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