2

尝试使用 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>

知道为什么吗?

4

3 回答 3

1

您需要注册“ http://java.sun.com/xml/ns/javaee ”命名空间,并选择一个前缀,比如“javaee”,然后/javaee:web-app/javaee:display-name用作您的 XPath 表达式。

根据此链接,您可以在插件<configuration>部分执行此操作:

<plugin>
    ...

    <configuration>
        <namespaceContexts>
            <javaee>http://java.sun.com/xml/ns/javaee</javaee>
        </namespac‌​eContexts>
        ...
于 2013-09-05T08:58:51.180 回答
0

“Prolog 中不允许的内容”要么意味着 XML 解析器在根元素的开始标记之前发现了除空白字符、注释或处理指令之外的其他内容,或者表示之前有字符<?xml(XML 声明必须是文件,在它之前甚至不允许有空格)。

检查 XML 文件在开始时没有字节顺序标记 - 某些编辑器(尤其是 Windows 记事本)习惯于向 UTF-8 文本文件添加一个,我知道这会导致某些 Java 版本中的 XML 解析器呛。

于 2013-09-03T20:49:30.727 回答
0

选择要完全替换的文本节点:

<replacement>
    <xpath>/web-app/display-name/text()</xpath>
    <token>^.*$</token> 
    <value>${project.name}</value> 
</replacement>

替换插件在使用选择节点的 xpath 时执行以下操作:

  1. 选择节点 ( <display-name>My Project</display-name>)
  2. 将整个节点转换为字符串 ( "<?xml version="1.0" encoding="UTF-8"?><display-name>My Project</display-name>")
  3. 替换该.*字符串中的标记 ( )(字符串现在"${project.name}"- 不再有 xml 标记)
  4. 将替换的字符串解析回 XML 节点:这会中断,因为您的字符串不是有效的 XML(因为您完全替换了它。)

解决这个问题最简单的方法是选择节点的文本节点。

奖励:在这种情况下,如果你的令牌是.*它会匹配两次(我不知道为什么),所以一定要使用它^.*$

于 2017-11-14T12:18:49.477 回答