In Maven2, was ist der einfachste Weg, um einen Krieg und die EAR zu enthalten, dass der Krieg in einem einzigen POM zu bauen?

StackOverflow https://stackoverflow.com/questions/1870149

Frage

Situation ist ziemlich einfach. Ich habe ein Java-Webapp, die ich Umwandlung mit Maven gebaut werden. Derzeit wird die App mit Ant in eine einzige WAR-Datei erstellt, die dann in eine EAR mit einem sehr einfachen application.xml gebündelt wird.

maven-war-plugin und beide maven-ear-plugin schauen 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. Dies scheint ein bisschen unbequem, vor allem, weil eine Profileinstellung des WAR-Projekt für jede Umgebung verändern wird, die, wie es mir scheint, zwingen würde, dass die Build zu duplizieren jedes Mal zwicken ich die EAR als auch zu bauen versucht.

All das zu sagen: Gibt es eine einfache Möglichkeit, den Krieg und Paket, das in diesem trivialer-simple EAR zu bauen? Ich mag diese als zwei separate Projekte vermeiden beibehalten, würde aber in ähnlicher Weise nicht lieber einen allzu chaotisch Hack greifen Baugruppen verwenden, dies zu erreichen.

War es hilfreich?

Lösung

  

All das zu sagen: Gibt es eine einfache Möglichkeit, den Krieg und Paket, das in diesem trivialer-simple EAR zu bauen? Ich mag diese als zwei separate Projekte vermeiden beibehalten, würde aber in ähnlicher Weise nicht lieber einen allzu chaotisch Hack greifen Baugruppen verwenden, dies zu erreichen.

Kurze Antwort: Nein , 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 wahr ist, in 99% der Fälle).

Und tatsächlich, würde ich empfehlen, auf nicht gehen die hacky Weg und vergessen Baugruppen mit einem EAR zu erstellen. Erstellen Sie stattdessen zwei Module, eines mit einer Verpackung des Typs war, das andere mit einer Verpackung vom Typ ear über den Krieg Artefakt abhängig und sie als Module eines Elternteils pom.xml erklären. 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, ist Hacker-Baugruppen zu tun, was die Maven-Ohr-Plugin bereits tut nur anti trocken. Sie würden besser halten Sie sich an Ant in diesem Fall.

Andere Tipps

Ich weiß, das jetzt 5 Jahre alt ist, aber es war immer noch die erste Antwort, die aufkam, als ich gesucht. Auch während „das ist nicht der Maven-Weg“ ist eine durchaus vernünftige Antwort für einige Leute, andere können noch einen einzigen pom bevorzugen als die OP gefragt, und es ist wirklich nicht so kompliziert.

Erstellen Sie zunächst ein Standard Krieg pom.xml den Krieg Datei, die Sie im Ohr aufnehmen möchten zu erzeugen. Lassen Sie die Verpackung als Krieg.

Sie dann Ihre eigene application.xml schreiben (in src / main / Anwendung oder wo auch immer) einen Platzhalter für die 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 umfassen alle anderen serverspezifische XML-Dateien (weblogic-application.xml etc.) an der gleichen Stelle.

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

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

Schließlich, fügen Sie eine Ameise Ohr Aufgabe gebaut Ohr:

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

In Maven jedes einzelne Projekt erzeugt ein aritifact. In Ihrer Situation schlage ich für den Krieg und einen für Ohr zwei Projekte erstellen. Wenn Sie mutltiple Versionen Ihrer Projekte benötigen, können Sie achive dass Sichter und Profile verwendet wird.

Dies ist 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 Ohr pom Nutzungsprofile erforderliche Abhängigkeit mit entsprechenden Klassifizierer 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>   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top