2010-02-11 4 views
5

Ich versuche ein Jar zu erstellen, das eine XML-Datei als Ressource hat. Ich möchte einen Filter auf dieses XML anwenden, um den Namen einer Abhängigkeit in das XML einzufügen. Die Filterung funktioniert, weil ich ${project.build.finalName} fallen lassen und es ersetzen konnte. Ich fand one hint, dass die Immobilie ich für vielleichtWie Filter Resource in Maven, durch eine ArtefaktId Abhängigkeiten ersetzen?

${project.dependencies[0].artifactId} 

suchen bin, aber das scheint nicht zu funktionieren. Ich bin auf der Suche

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

mit

<fileName>OtherLibrary</fileName> 

zu ersetzen Ist das möglich?

xml, die in src/main/resources ist:

<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

Dies ist Maven 2.2.1 durch die Art und Weise. – Jim

Antwort

7

Verdammt, du hast Recht, diese Eigenschaft nicht während der Filterung ersetzt bekommt von Ressourcen. Das ist seltsam und es klingt wie ein Fehler in der Maven Resources Plugin, weil diese Eigenschaft korrekt während der process-resources Phase interpoliert wird, wie ich in der unten beschriebenen Problemumgehung demonstriere (basierend auf dem Maven-Antrun-Plugin und der replace Aufgabe).

Zunächst folgendes zu Ihrem POM hinzu:

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

Dann aktualisieren Sie Ihre XML-Datei in:

<somenode> 
    <fileName>@@@</fileName> 
</somenode> 

Mit diesen Änderungen mvn process-resources läuft folgendes Ergebnis erzeugen würde:

$ cat target/classes/myxmlfile.xml 
<somenode> 
    <fileName>OtherLibrary</fileName> 
</somenode> 

Das beweist, dass die Eigenschaft interpoliert ist (aber nicht während maven fi gesetzt wird) Filterung von Ressourcen) . Wenn Sie mehr als eine Datei filtern müssen, kann die Task replace eine Dateigruppe aufnehmen. Passen Sie es Ihren Bedürfnissen an.

Eigentlich wäre es schön, ein neues Jira für diesen Fehler in den Maven 2.x Resources Plugin zu erstellen. Ich habe MRESOURCES-118 erstellt.

+0

die Interpolation und Filterung verwenden nicht den gleichen Algorithmus, so dass die Filterung wird nur eine Teilmenge der Ausdrücke haben –

+0

@Brett Danke für die Erklärung. –

+0

Vielen Dank für das Hinzufügen des Fehlerberichts und für die Problemumgehung. – Jim

1

Die indexierten Eigenschaften sind nur in der Plugin-Konfiguration verfügbar, da Maven das POM interpoliert - es ist also verfügbar, um die Aufgabe zu ersetzen, aber nicht die Filterung.

Der Zugriff auf Abhängigkeiten nach Index ist jedoch nicht sehr robust - er ist anfällig für Änderungen im übergeordneten Element.

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

Sie können dann weiter den Eigenschaftsnamen filtern, indem: Sie könnten stattdessen die folgenden in pom.xml verwenden

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

Eigentlich habe ich versucht, was Sie vorschlagen, in der ersten Lösung, als ich meine Antwort schrieb (und erwähnte es in http://jira.codehaus.org/browse/MRESOURCES-118), aber das hat nicht funktioniert, Sie Ich bekomme ' $ {project dependencies [0] .artefactId}' in der gefilterten Ressource. Aber die zweite Lösung ist definitiv eine gute Lösung. –

+0

Sie haben Recht, tut mir leid. Die Interpolationsmechanismen haben sich zwischen Maven 2.0.x, 2.2.x und 3.0 ziemlich verändert. Ich glaube, dass dieser Ausdruck in den meisten Versionen von Maven nur innerhalb der Plugin-Konfiguration verfügbar sein wird, also ist es am besten, sich nicht darauf zu verlassen. –

+0

Ich sollte darauf hinweisen, dass der Grund, warum ich das suche, ist, was ich denke, ist eine einzigartige Situation/Rand Fall, wo ich nicht EJB Glas in meine persistence.xml hinzufügen muss. Und da das ear-plugin keine Möglichkeit hat, die Benennungskonvention für jars im lib-Ordner anzugeben, habe ich diesen Pfad gewählt. Das War-Plugin hat eine nette Möglichkeit, um den Gläsern ein Namensschema zu geben, das ich mir für das Ohr-Plugin wünschte. Siehe zum Beispiel http://jira.codehaus.org/browse/MEAR-98. Schließlich werde ich das Nicht-Ejb-Glas aus der Existenz zu kodieren. Es ist nur ein Glas, das ich geerbt habe und arbeite daran, mich zu integrieren. – Jim