2010-02-11 70 views
5

我想构建一个具有xml文件作为资源的jar。我想将过滤器应用于该xml以将依赖项的名称插入到xml中。过滤工作正常,因为我可以放入${project.build.finalName}并取代它。我发现one hint,我正在寻找的属性可能是如何过滤Maven中的资源,替换为依赖项artifactId?

${project.dependencies[0].artifactId} 

,但似乎并没有工作。我期待,以取代

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

<fileName>OtherLibrary</fileName> 

这可能吗?

XML,这在src /主/资源:

<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

这是顺便说一下行家2.2.1。 – Jim 2010-02-11 18:43:00

回答

7

妈的,你是对的,这个属性没有得到过滤过程中更换的资源。这很奇怪,这听起来像是Maven Resources Plugin中的一个错误,因为在process-resources阶段正确插入了该属性,我将在下面建议的解决方法中演示(基于maven-antrun-plugin和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 fi期间设置过滤资源)。如果您需要过滤多个文件,replace任务可以采用一个文件集。适应它以适应您的需求。

事实上,这将是很好创建一个新的吉拉在 Maven 2.x Resources Plugin这个bug。 我创建了MRESOURCES-118

+0

插值和过滤不使用相同的算法,所以过滤只会有一个表达式的子集 – 2010-02-11 23:12:29

+0

@Brett感谢您的解释。 – 2010-02-11 23:39:30

+0

感谢您添加错误报告以及解决方法。 – Jim 2010-02-12 15:56:02

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> 
+1

事实上,当我在写我的答案(并在http://jira.codehaus.org/browse/MRESOURCES-118中提到它)时,我确实尝试了你在第一个解决方案中提出的建议,但这不起作用,你将在过滤的资源中获得' $ {project.dependencies [0] .artifactId}'。但第二个解决方案绝对是一个好方法。 – 2010-02-12 01:31:41

+0

你是对的,对不起。插值机制在Maven 2.0.x,2.2.x和3.0之间经历了相当多的变化。我相信这个表达式只能在大多数Maven版本的插件配置中使用,所以最好不要依赖它。 – 2010-02-12 12:12:26

+0

我应该指出,我正在寻找这个的原因是我认为是一种独特的情况/边缘情况,我需要将非EJB jar添加到我的persistence.xml中。而且由于ear插件没有办法为lib文件夹中的jar指定命名约定,所以我沿着这条路走下去了。战争插件有一个很好的方法来使罐子遵循一个我希望耳塞插入的命名模式。例如,请参阅http://jira.codehaus.org/browse/MEAR-98。 最终我将编码非ejb罐子存在。这只是我继承的一个罐子,我正在努力整合。 – Jim 2010-02-12 16:12:32