2009-12-08 6 views
8

Die Situation ist ziemlich einfach. Ich habe eine Java-Webanwendung, die ich mit Maven erstellen möchte. Gegenwärtig wird die App mit Ant in eine einzelne WAR-Datei integriert, die dann mit einer sehr einfachen application.xml zu einem EAR gebündelt wird.In Maven2, was ist der einfachste Weg, um eine WAR und die EAR, um diese WAR in einem einzigen POM zu enthalten?

maven-war-plugin und maven-ear-plugin sehen beide ziemlich einfach zu mir, und es scheint, dass sie mich sind die Einrichtung gezwungen zu werden, die oben als zwei verschiedene Projekte zu prüfen, mit dem WAR-Projekt als Abhängigkeit des EAR-Projektes. Das scheint ein bisschen unpraktisch zu sein, vor allem, weil sich eine Profileinstellung des WAR-Projekts für jede Umgebung ändert, was mich dazu zwingt, diese Build-Tweak-Funktion jedes Mal zu duplizieren, wenn ich versuchte, das EAR zu erstellen.

All das zu sagen: gibt es eine direkte Möglichkeit, den WAR zu bauen und das in diese trivial einfache EAR zu verpacken? Ich würde es gerne vermeiden, diese als zwei separate Projekte zu erhalten, würde es aber auch bevorzugen, nicht auf einen übermäßig unordentlichen Hack mit Assemblies zurückzugreifen, um dies zu erreichen.

Antwort

17

All das zu sagen: gibt es eine direkte Möglichkeit, den WAR zu bauen und das in diese trivial-einfache EAR zu verpacken? Ich würde es gerne vermeiden, diese als zwei separate Projekte zu erhalten, würde es aber auch bevorzugen, nicht auf einen übermäßig unordentlichen Hack mit Assemblies zurückzugreifen, um dies zu erreichen.

Kurze Antwort: keine, gibt es keinen einfachen Maven-Weg, dies zu tun, da dies gegen eine Maven Regel gehen würde, die „ein Artefakt pro Projekt“ (versteht eine Ausgabe pro Projekt, das in 99 wahr ist % der Fälle).

Und eigentlich würde ich dringend empfehlen nicht gehen Sie den Hacky Weg und vergessen Sie mit Baugruppen, um ein EAR zu erstellen. Erstellen Sie stattdessen zwei Module, eines mit einer Verpackung vom Typ war, das andere mit einer Verpackung vom Typ ear, abhängig vom Kriegsartefakt und deklarieren Sie sie als Module eines Elternteils pom.xml. Wie folgt aus:

my-project 
|-- pom.xml  // packaging of type pom and my-war and my-ear as modules 
|-- my-war 
| `-- pom.xml // packaging of type war 
`-- my-ear 
    `-- pom.xml // packaging of type ear 

Wenn Sie Maven gehen, nehmen sie Maven Philosophie, kämpfen nicht gegen sie, wird es Ihnen viel Schmerz speichern. Im Ernst, Hacking Assemblies zu tun, was das Maven-Ear-Plugin bereits macht, ist nur Anti-DRY. Sie sollten besser in diesem Fall bei Ant bleiben.

+1

+1 - kämpfen Sie Maven nicht –

+0

Für was es wert ist, war ich einen Hacky Ansatz/Kampf gegen Maven nicht befürworten, ich spürte einfach, dass es zu schaffen, mehr Projekte/Module kein anderer Ausgang kurz war. Ich habe nur die Frage zu SO gestellt, um zu bestätigen, dass es tatsächlich keinen sauberen Weg gab, dies in einem einzigen Projekt zu erreichen. Daher plane ich mit dem oben beschriebenen Layout. –

2

In Maven produziert jedes einzelne Projekt ein Artefakt. In Ihrer Situation schlage ich vor, zwei Projekt für Krieg und eins für Ohr zu erstellen. Wenn Sie mehrere Versionen Ihrer Projekte benötigen, können Sie dies mit Klassifikatoren und Profilen erreichen.

Dies ist ein Auszug aus Richfaces Beispiele Pom.

<plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>jee5</id> 
      <phase>package</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
      <configuration> 
       <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory> 
       <classifier>jee5</classifier> 
       <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes> 
       <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes> 
      </configuration> 
      </execution> 
      <execution> 
      <id>tomcat6</id> 
      <phase>package</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
      <configuration> 
       <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory> 
       <classifier>tomcat6</classifier> 
       <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes> 
       <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes> 
      </configuration> 
      </execution> 
     </executions> 
     <configuration> 
      <webResources> 
      <resource> 
       <directory>${basedir}/src/main/java</directory> 
       <targetPath>/WEB-INF/src</targetPath> 
      </resource> 
      </webResources> 
     </configuration> 
     </plugin> 

In Ihrem Nutzungsprofil Ohr pom erforderliche Abhängigkeit mit entsprechenden Klassifizierer zu importieren.

<profile> 
    <id>jee5</id> 
    <dependencies> 
    <dependency> 
     <groupId>org.richfaces.samples</groupId> 
     <artifactId>richfaces-demo</artifactId> 
     <version>${richfaces-version}</version> 
     <classifier>jee5</classifier> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 
    </dependencies> 
</profile> 
2

Ich weiß, das ist jetzt 5 Jahre alt, aber es war immer noch die erste Antwort, die kam, als ich suchte. Auch wenn "das ist nicht der richtige Weg" ist eine durchaus vernünftige Antwort für einige Leute, andere bevorzugen vielleicht immer noch einen einzigen Pom wie das OP gefragt, und es ist wirklich nicht so kompliziert.

Erstellen Sie zuerst eine standard warpom.xml, um die WAR-Datei zu generieren, die Sie in das Ohr aufnehmen möchten. Belasse die Verpackung als Krieg.

dann Ihre eigene application.xml schreiben (in src/main/Anwendung oder wo auch immer) einen Platzhalter für den Krieg Dateinamen verwenden:

<application xmlns="http://java.sun.com/xml/ns/javaee" ... > 
    <module> 
    <web> 
     <web-uri>${project.build.finalName}.war</web-uri> 
     <context-root>myapp</context-root> 
    </web> 
    </module> 
</application> 

und enthalten andere serverspezifische XML-Dateien (Weblogic-Anwendung .xml usw.) am selben Ort.

Als nächstes fügen Sie einen Abschnitt Ressourcen den Platzhalter mit dem Krieg Dateinamen zu ersetzen:

<resources> 
    <resource> 
    <directory>src/main/application</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/*.xml</include> 
    </includes> 
    </resource> 
</resources> 

schließlich das Ohr eine Ameise Ohr Aufgabe gebaut hinzufügen:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>run</goal> 
     </goals> 
     <configuration> 
     <tasks> 
      <ear destfile="${project.build.directory}/${project.build.finalName}.ear" 
       appxml="${project.build.outputDirectory}/META-INF/application.xml"> 
      <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/> 
      <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/> 
      </ear> 
     </tasks> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Und das ist es.