我正在尝试构建一个将xml文件作为资源的jar。我想对该xml应用过滤器以将依赖项的名称插入到xml中。过滤工作正常,因为我能够放入${project.build.finalName}
并将其替换掉。我发现one hint我正在寻找的属性可能是
${project.dependencies[0].artifactId}
但这似乎不起作用。我想替换
<fileName>${project.dependencies[0].artifactId}</fileName>
与
<fileName>OtherLibrary</fileName>
这可能吗?
xml,位于src / main / resources中:
<somenode>
<fileName>${project.dependencies[0].artifactId}</fileName>
</somenode>
的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>Thing</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Thing</name>
<url>http://maven.apache.org</url>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>com.pts</groupId>
<artifactId>OtherLibrary</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
答案 0 :(得分:7)
该死的,你是对的,这个属性在过滤资源时不会被替换。这很奇怪,它听起来像是Maven Resources Plugin中的一个错误,因为这个属性在process-resources
阶段被正确插值,我将在下面建议的解决方法中进行演示(基于maven-antrun-插件和replace
任务)。
首先,将以下内容添加到您的POM中:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>process-resources</phase>
<configuration>
<tasks>
<echo>${project.dependencies[0].artifactId}</echo><!-- I'm a test -->
<replace file="${project.build.outputDirectory}/myxmlfile.xml"
token="@@@" value="${project.dependencies[0].artifactId}"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
然后,将您的XML文件更新为:
<somenode>
<fileName>@@@</fileName>
</somenode>
通过这些更改,运行mvn process-resources
会产生以下结果:
$ cat target/classes/myxmlfile.xml
<somenode>
<fileName>OtherLibrary</fileName>
</somenode>
证明该属性是内插的(但在maven过滤资源期间未设置) 1 。如果您需要过滤多个文件,replace
任务可以采用文件集。根据您的需求进行调整。
1 实际上,在Maven 2.x Resources Plugin中为这个bug创建一个新的Jira会很好。我创建了{{3 }} 子>
答案 1 :(得分:1)
由于Maven插入POM的方式,索引属性仅在插件配置中可用 - 因此它可用于antrun的替换任务,但不能用于过滤。
但是,通过索引访问依赖项不是很强大 - 它很容易受到父项的更改。您可以改为在pom.xml
中使用以下内容:
<properties>
<fileName>some-name</fileName>
</properties>
...
<dependency>
<groupId>your.group.id</groupId>
<artifactId>${fileName}</artifactId>
...
</dependency>
然后,您可以继续使用属性名称进行过滤:
<somenode>
<fileName>${fileName}</fileName>
</somenode>