1

我想使用 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())

问题是这以某种方式将项目属性拉入groupIdartifactIdxml 标记并在项目标记中复制它们,并且它没有应用正确的格式。我该如何解决这个问题?

我在这个网站上看到了各种类似的问题,但我无法将它们应用于我的问题。

编辑:我稍微简化了转换方法并且能够修复格式,但我不明白这个属性是如何出现在错误的标签中的。

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
    }
4

0 回答 0