Maven replacer插件中的XPath问题
在尝试使用XPath替换web.xml中的Maven replacer插件时,出现以下错误Maven replacer插件中的XPath问题,maven,xpath,Maven,Xpath,在尝试使用XPath替换web.xml中的Maven replacer插件时,出现以下错误 [ERROR] Failed to execute goal com.google.code.maven-replacer-plugin:replacer:1.5.2:replace (default) on project my-project: Error during XML replacement: Content is not allowed in prolog. -> [Help 1]
[ERROR] Failed to execute goal com.google.code.maven-replacer-plugin:replacer:1.5.2:replace (default) on project my-project:
Error during XML replacement: Content is not allowed in prolog. -> [Help 1]
这是Maven的代码
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.2</version>
<executions>
<execution>
<phase>prepare-package</phase> <goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<file>src/main/webapp/WEB-INF/web.xml</file>
<outputFile>target/web.xml</outputFile>
<regexFlags>
<regexFlag>CASE_INSENSITIVE</regexFlag>
</regexFlags>
<replacements>
<replacement>
<xpath>/web-app/display-name</xpath>
<token>.*</token>
<value>${project.name}</value>
</replacement>
</replacements>
</plugin>
com.google.code.maven-replacer-plugin
替代者
1.5.2
准备包装
代替
src/main/webapp/WEB-INF/WEB.xml
target/web.xml
不区分大小写
/web应用程序/显示名称
.*
${project.name}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="my-project"
version="2.5">
<display-name>My Project</display-name>
...
</web-app>
我的项目
...
知道为什么吗?“prolog中不允许的内容”要么意味着XML解析器在根元素的开始标记之前发现了除空白字符、注释或处理指令以外的内容,要么意味着在之前有字符,您需要注册“”命名空间,并选择前缀,比如“javaee”,然后使用/javaee:web app/javaee:display name
作为XPath表达式
根据这一点,您可以在插件的
部分执行此操作:
<plugin>
...
<configuration>
<namespaceContexts>
<javaee>http://java.sun.com/xml/ns/javaee</javaee>
</namespaceContexts>
...
...
http://java.sun.com/xml/ns/javaee
...
选择要完全替换的文本节点:
<replacement>
<xpath>/web-app/display-name/text()</xpath>
<token>^.*$</token>
<value>${project.name}</value>
</replacement>
/web应用程序/显示名称/文本()
^.*$
${project.name}
使用选择节点的XPath时,replacer插件执行以下操作:
选择节点(我的项目
)
将整个节点转换为字符串(“我的项目”
)
替换该字符串中的标记(*
)(字符串现在是“${project.name}”
-不再有xml标记)
将替换的字符串解析回XML节点:这会中断,因为您的字符串不是有效的XML(因为您完全替换了它)
解决此问题的最简单方法是选择节点的文本节点
奖励:在这种情况下,如果您的令牌是*
,它将匹配两次(我不知道为什么),因此请确保使用^.*$
。可能是“”命名空间。显然,根据,您需要添加http://java.sun.com/xml/ns/javaee
在插件的
中,然后可以使用/javaee:web app/javaee:display name
是的,就是这样。请添加您的评论作为答案,以便我可以投票并接受。谢谢。通常情况是这样,但这里的根本原因是不同的。