2010-02-11 66 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