Domanda

La situazione è abbastanza semplice. Ho una webapp Java che sto convertendo da costruire con Maven. Allo stato attuale, l'applicazione è costruita con Ant in un unico file WAR, che viene poi impacchettato in un orecchio con un semplice application.xml.

maven-war-plugin e maven-ear-plugin entrambi sembrano piuttosto semplice per me, e sembra che mi stanno di impostare fino a essere costretti a prendere in considerazione quanto sopra come due progetti distinti, con il progetto WAR come dipendenza del progetto EAR. Questo sembra un po 'scomodo, soprattutto perché un'impostazione del profilo del progetto WAR cambierà per ogni ambiente, che sembra che mi avrebbe costretto a duplicare che costruiscono tweaking ogni volta che ho tentato di costruire l'EAR pure.

Tutto questo per dire: c'è un modo semplice per costruire la guerra e pacchetto che in questo banalmente-EAR semplice? Mi piacerebbe evitare il mantenimento di questi come due progetti separati, ma sarebbe simile preferisce non ricorrere ad un trucco troppo disordinato con assemblee per raggiungere questo obiettivo.

È stato utile?

Soluzione

  

Tutto questo per dire: c'è un modo semplice per costruire la guerra e pacchetto che in questo banalmente-EAR semplice? Mi piacerebbe evitare il mantenimento di questi come due progetti separati, ma sarebbe simile preferisce non ricorrere ad un trucco troppo disordinato con assemblee per raggiungere questo obiettivo.

Risposta breve: non , non v'è alcuna semplice Maven-modo per farlo in quanto ciò sarebbe in contrasto con una norma Maven che è "un artefatto per progetto" (capire un'uscita per ogni progetto che è vero nel 99% dei casi).

E in realtà, vi consiglio vivamente a non andare il modo hacky e dimenticare con le assemblee per creare un EAR. Invece, creare due moduli, uno con una confezione di tipo war, l'altra con un imballaggio di tipo ear seconda guerra manufatto e dichiarare come moduli di un pom.xml genitore. In questo modo:

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

Se si va per Maven, adottare la filosofia Maven, non combattere contro di esso, vi farà risparmiare molto dolore. Scherzi a parte, l'hacking assemblee per fare ciò che l'esperto-ear-plugin è già facendo è solo di anti SECCO. Faresti meglio attenersi a Ant in quel caso.

Altri suggerimenti

So che questo è 5 anni ormai, ma era ancora la prima risposta che è venuto quando ho cercato. Inoltre, mentre "non è questo il modo in cui Maven" è una risposta perfettamente ragionevole per alcune persone, altri possono ancora preferiscono usare un unico pom come ha chiesto il PO, e non è poi così complicato.

In primo luogo, creare un pom.xml guerra standard per generare il file di guerra che si desidera includere nell'orecchio. Lasciare la confezione come la guerra.

Poi scrivere il proprio application.xml (in src / main / applicazione o dovunque) utilizzando un segnaposto per il nome del file di guerra:

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

E includere altri file XML specifici del server (weblogic-application.xml etc.) nella stessa posizione.

Quindi, aggiungere una sezione di risorse per sostituire il segnaposto con il nome del file di guerra:

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

Infine, aggiungere un compito orecchio formica per costruire l'orecchio:

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

E questo è tutto.

In Maven ogni singolo progetto produrre un aritifact. Nella tua situazione ti suggerisco di creare due progetti uno per la guerra e uno per orecchio. Se avete bisogno di versioni mutltiple dei vostri progetti è possibile achive che l'utilizzo di classificatori e profili.

Questa è estratto di RichFaces esempi 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>

nell'orecchio profili d'uso pom importare dipendenza richiesta con adeguate classificatore.

<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>   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top