2010-04-22 7 views
11

Ich möchte zwei verschiedene Versionen eines WAR in Maven erstellen (ich weiß, dass das ein No-No ist, das ist genau so, wie es die aktuelle Situation ist). In der Version einer WAR, die von einer Assembly dargestellt wird, möchte ich eine Abhängigkeit durch die gleiche Abhängigkeit durch einen anderen Klassifikator ersetzen. Zum Beispiel habe ich erwartet, dass diese Baugruppe funktioniert:Maven Assembly: eine Abhängigkeit mit einem anderen Klassifikator enthalten

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <excludes> 
     <exclude>group:artifact:jar:${project.version}</exclude> 
     </excludes> 
     <includes> 
     <include>group:artifact:jar:${project.version}:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Das funktioniert nicht, aber gehe ich in die richtige Richtung? Ich habe bereits alle Seiten über die Maven assembly page und den Abschnitt über die Maven Definitive Guide gelesen, der relevant erscheint. Alle Hinweise wären hilfreich.

+0

Ich hatte ein ähnliches Problem. Ich fand diese FAQ-Frage half mir http://maven.apache.org/plugins/maven-assembly-plugin/faq.html#dashClassifier – Stewart

Antwort

8

Persönlich denke ich, dass die sauberste Lösung wäre, zwei Profile zu verwenden (eines davon hängt vom Artefakt mit dem Klassifikator ab, das andere vom "regulären" Artefakt). Aber Sie können tatsächlich mit einer benutzerdefinierten Baugruppe erreichen, was Sie wollen. Ich glaube nur nicht, dass du in die richtige Richtung gehst. Hier ist, wie ich es tun würde ...

Erstellen Sie zuerst ein bestimmtes Projekt für die Assembly und deklarieren Sie sowohl die Webanwendung als auch das Artefakt mit dem Klassifizierer als Abhängigkeiten. Etwas wie folgt aus:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>artifact</artifactId> 
     <version>${project.version}</version> 
     <classifier>end-user<classifier> 
    </dependency> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>zewebapp</artifactId> 
     <version>${project.version}</version> 
     <type>war</type> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/end-user.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <!-- this is used for inheritance merges --> 
      <phase>package</phase> 
      <!-- append to the packaging phase. --> 
      <goals> 
       <goal>single</goal> 
       <!-- goals == mojos --> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Dann in Ihrem Assembly Descriptor:

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <unpackOptions> 
     <excludes> 
      <exclude>**/artifact-*.jar</exclude> 
     </excludes> 
     </unpackOptions> 
     <includes> 
     <include>*:war</include> 
     </includes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>false</unpack> 
     <outputDirectory>WEB-INF/lib</outputDirectory> 
     <includes> 
     <include>group:artifact:jar:*:end-user</include> 
     </includes> 
    </dependencySet>  
    </dependencySets> 
</assembly> 

Im Grunde ist dies erzählt die Montage-Plugin, den Krieg für zewebapp zu bekommen und es zu entpacken, aber das unerwünschte Artefakt auszuschließen beim Auspacken . Dann holt das Assembly-Plugin das Artefakt mit dem Klassifikator und legt es in WEB-INF/lib (so ersetzen wir es durch das Original). Schließlich ist das Ganze als Krieg verpackt.

Ich testete dies an einem vereinfachten Beispiel, es sollte funktionieren.

+0

Cool, danke ... Ich hatte gehofft, es gab einen Weg, um es mit Baugruppen aus zu tun das gleiche Projekt, aber die Rückmeldung, dass ich das falsch gemacht habe, war hilfreich. –

+0

@James Es kann möglich sein, indem man beide Abhängigkeiten im Warmodul deklariert (mit dem Classifier und ohne), mit Scopes usw. spielt. Aber das wäre irgendwie unklar und ich wähle den separaten Modulansatz. –

4

Die Informationen zur Version sind nicht erforderlich, wenn Artefaktkoordinaten für includes/include * angegeben werden.

sollte diese Arbeit:

<assembly> 
    <id>end-user</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <includes> 
     <include>group:artifact:jar:end-user</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Ich denke, die maven assembly documentation für die/include enthält * Abschnitt nicht korrekt ist. Darin heißt es: "Artefaktkoordinaten können in einfacher groupId: artifactId-Form angegeben werden, oder sie können vollständig in der Form groupId: artifactId: type: version [: classifier] qualifiziert sein." Aus meinen Tests ist die "Version" jedoch nicht erforderlich. Ich habe den Hinweis von here bekommen.

Nahm mich, um herauszufinden, Gedanken könnten für andere in der Zukunft nützlich sein.

Verwandte Themen