Maven 2 如何在Maven中过滤资源,替换为依赖项artifactId?

Maven 2 如何在Maven中过滤资源,替换为依赖项artifactId?,maven-2,dependencies,filtering,resources,Maven 2,Dependencies,Filtering,Resources,我正在尝试构建一个jar,其中包含一个xml文件作为资源。我想对该xml应用一个过滤器,将依赖项的名称插入到xml中。过滤正在工作,因为我能够插入${project.build.finalName}并替换它。我发现我要找的房子可能是 ${project.dependencies[0].artifactId} 但这似乎不起作用。我正在寻找替代者 <fileName>${project.dependencies[0].artifactId}</fileName> ${pr

我正在尝试构建一个jar,其中包含一个xml文件作为资源。我想对该xml应用一个过滤器,将依赖项的名称插入到xml中。过滤正在工作,因为我能够插入
${project.build.finalName}
并替换它。我发现我要找的房子可能是

${project.dependencies[0].artifactId}
但这似乎不起作用。我正在寻找替代者

<fileName>${project.dependencies[0].artifactId}</fileName>
${project.dependencies[0].artifactId}

OtherLibrary
可能吗

xml,位于src/main/resources中:

<somenode>
  <fileName>${project.dependencies[0].artifactId}</fileName>
</somenode>

${project.dependencies[0].artifactId}
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>

4.0.0
com.foo
事情
1.0-快照
事情
http://maven.apache.org
${basedir}/src/main/resources
真的
com.pts
其他库
1.0-快照
假如
朱尼特
朱尼特
3.8.1
测试

该死,你说得对,这个属性在过滤资源时不会被替换。这很奇怪,听起来像是中的一个bug,因为这个属性在
过程资源
阶段被正确插入,我将在下面建议的解决方法中演示(基于maven antrun插件和任务)

首先,将以下内容添加到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>
这证明该属性是插值的(但在maven过滤资源时未设置)1。如果需要筛选多个文件,则该任务可以采用一个文件集。调整它以适应你的需要


1事实上,为这个bug创建一个新的Jira会很好。我已经创建了。

由于Maven插值POM的方式,索引属性将仅在插件配置中可用-因此它可用于antrun的替换任务,但不用于过滤

然而,通过索引访问依赖项不是很可靠——它容易受到父项中的更改的影响。您可以在
pom.xml
中使用以下内容:

<properties>
  <fileName>some-name</fileName>
</properties>
...
<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>${fileName}</artifactId>
  ...
</dependency>

某个名字
...
您的.group.id
${fileName}
...
然后,您可以继续使用属性名称进行筛选:

<somenode>
  <fileName>${fileName}</fileName>
</somenode>

${fileName}

顺便说一句,这是maven 2.2.1。插值和过滤不使用相同的算法,因此过滤只会有expressions@Brett谢谢你的解释。事实上,当我在写我的答案时,我确实尝试了你在第一个解决方案中提出的建议(并在中提到),但这不起作用,您将在筛选的资源中获得
${project.dependencies[0].artifactId}
。但是第二个解决方案绝对是好的。你是对的,对此感到抱歉。插值机制在Maven 2.0.x、2.2.x和3.0之间经历了相当大的变化。我相信在大多数版本的Maven中,这个表达式只能在插件配置中使用,所以最好不要依赖它。我应该指出,我之所以寻找这个表达式,是因为我猜这是一个独特的情况/边缘情况,我需要在persistence.xml中添加非EJB jar。由于ear插件无法指定lib文件夹中jar的命名约定,所以我选择了这条路径。war插件有一个很好的方法使JAR遵循我希望ear插件具有的命名模式。例如,见。最后,我将编写一个不存在的非ejb jar代码。这只是我继承的一个罐子,我正在努力集成它。
$ cat target/classes/myxmlfile.xml 
<somenode>
  <fileName>OtherLibrary</fileName>
</somenode>
<properties>
  <fileName>some-name</fileName>
</properties>
...
<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>${fileName}</artifactId>
  ...
</dependency>
<somenode>
  <fileName>${fileName}</fileName>
</somenode>