尝试使用XPath在web.xml中替换Maven替换器插件时出现以下错误
[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>
的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>
知道为什么吗?
答案 0 :(得分:1)
您需要注册“http://java.sun.com/xml/ns/javaee”命名空间,并选择一个前缀,例如“javaee”,然后使用/javaee:web-app/javaee:display-name
作为您的XPath表达式。
根据此link,您可以在插件的<configuration>
部分执行此操作:
<plugin>
...
<configuration>
<namespaceContexts>
<javaee>http://java.sun.com/xml/ns/javaee</javaee>
</namespaceContexts>
...
答案 1 :(得分:0)
“prolog中不允许的内容”或者意味着XML解析器在根元素的开始标记之前找到了除空格字符,注释或处理指令之外的其他内容,或者在<?xml
之前有字符(XML)声明必须是文件中的第一个东西,在它之前不允许空格。)
检查XML文件在开始时没有字节顺序标记 - 某些编辑器(特别是Windows记事本)习惯在UTF-8文本文件中添加一个,我知道这会导致某些版本的XML解析器Java的窒息。
答案 2 :(得分:0)
选择要完全替换的文本节点:
<replacement>
<xpath>/web-app/display-name/text()</xpath>
<token>^.*$</token>
<value>${project.name}</value>
</replacement>
当使用选择节点的xpath时,replacer插件执行以下操作:
<display-name>My Project</display-name>
)"<?xml version="1.0" encoding="UTF-8"?><display-name>My Project</display-name>"
).*
)(字符串现在是"${project.name}"
- 不再有xml标记)解决此问题的最简单方法是选择节点的文本节点。
奖励:在这种情况下,如果您的令牌为.*
,它将匹配两次(我不确定原因),因此请务必使用^.*$
。