我想使用 scala-xml 更改一堆 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>theArtifactId</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.3.Final</version>
</dependency>
</dependencies>
</project>
我想更改 to 的hibernate-core
版本MY-SNAPSHOT
。这是我的尝试,我认为它接近解决方案:
import scala.xml.transform.{RewriteRule, RuleTransformer}
import scala.xml.{Node, Elem, XML}
val newVersion = "MY-SNAPSHOT"
val rewriteRule = new RewriteRule {
override def transform(node: Node): Seq[Node] =
node match {
case e @ Elem(_, "dependency", _, _, _*) if (e \ "artifactId").text == "hibernate-core" => {
val content = e.child.collect {
case e @ Elem(_, "version", _, _, _*) => <version>{newVersion}</version>
case e: Elem => e
}
<dependency>{content}</dependency>
}
case _ => node
}
}
val pom = XML.loadFile("example-pom.xml")
val transform = new RuleTransformer(rewriteRule)
println(transform(pom).toString())
问题是这以某种方式将项目属性拉入groupId
和artifactId
xml 标记并在项目标记中复制它们,并且它没有应用正确的格式。我该如何解决这个问题?
我在这个网站上看到了各种类似的问题,但我无法将它们应用于我的问题。
编辑:我稍微简化了转换方法并且能够修复格式,但我不明白这个属性是如何出现在错误的标签中的。
override def transform(node: Node): Seq[Node] =
node match {
case e: Elem if e.label == "dependency" && (e \ "artifactId").text == "hibernate-core" => {
val content = e.child.map(child =>
child.label match {
case "version" => <version>{newVersion}</version>
case _ => child
}
)
<dependency>{content}</dependency>
}
case _ => node
}