Jetty contextXML文件占位符未被Maven替换的解决方法咨询
我之前也碰到过一模一样的情况,Jetty插件默认不会自动处理contextXML文件里的Maven属性占位符——因为这个XML是Jetty自身加载的,Maven只会处理自己管控的资源(比如配置的resource目录下的文件),不会主动去替换Jetty配置文件里的变量。下面给你两个可行的解决办法:
方法一:利用Maven资源过滤预替换占位符
这个思路是让Maven先把contextXML当成资源文件处理,替换里面的占位符后,再让Jetty加载替换后的文件。
- 在你的pom.xml中添加资源过滤配置,指定Jetty XML所在的目录开启过滤:
<build> <resources> <resource> <directory>src/main/resources/jetty</directory> <filtering>true</filtering> <includes> <include>${jetty.mode}-jetty.xml</include> </includes> </resource> </resources> </build>
- 修改Jetty插件的
contextXml路径,指向Maven构建后生成的过滤文件(默认在target/classes目录下):
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <!-- 保留你原有的其他配置 --> <contextXml>${project.build.outputDirectory}/jetty/${jetty.mode}-jetty.xml</contextXml> </configuration> </plugin>
这样Maven在执行process-resources阶段时,会自动把src/main/resources/jetty下的目标XML文件里的${active-mq.host}和${active-mq.port}替换成主pom里定义的值,Jetty加载的就是已经替换好的文件了。
方法二:将Maven属性传递为Jetty系统属性
Jetty在解析contextXML时,会自动替换系统属性的占位符。所以我们可以把Maven里的属性传递给Jetty的系统属性,然后在XML里直接引用这些系统属性。
- 在Jetty插件的配置中添加
systemProperties,把Maven属性映射为系统属性:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <!-- 保留你原有的stopKey、stopPort、webAppConfig等配置 --> <systemProperties> <systemProperty> <name>active-mq.host</name> <value>${active-mq.host}</value> </systemProperty> <systemProperty> <name>active-mq.port</name> <value>${active-mq.port}</value> </systemProperty> </systemProperties> <contextXml>${project.basedir}/src/main/resources/jetty/${jetty.mode}-jetty.xml</contextXml> </configuration> </plugin>
- 保持你的
stub-jetty.xml里的写法不变:
<Arg>tcp://${active-mq.host}:${active-mq.port}</Arg>
Jetty在加载这个XML时,会自动从系统属性中查找对应的active-mq.host和active-mq.port值,完成替换。
为什么原方式不行?
简单来说,Maven和Jetty是两个独立的环节:Maven负责构建过程中的变量替换,但只会处理它配置的资源文件;Jetty负责加载并解析自己的XML配置,它只认识系统属性或者自身的内部属性,不认识Maven的占位符。所以直接在Jetty的contextXML里写Maven占位符,Jetty会把它当成普通字符串处理,自然就抛出URI格式错误了。
内容的提问来源于stack exchange,提问作者SavinI

