2012-01-04 6 views
23

Tengo un único proyecto maven que tiene múltiples clases principales. Quiero generar Jars ejecutables (que incluyan alle depenices) fuera de estos proyectos. En este momento tengo la siguiente configuración de generación (utilizando maven.assembly):Crear múltiples Jars ejecutables (con dependencias incluidas) de un solo proyecto de Maven

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

Es su manera de achive esto con maven-ensamblaje? Si no, ¿cuál es la forma más sencilla de lograr mi objetivo?

+0

¿Ha intentado crear varios '' entradas para 'experta en montaje-Plugin' con diferentes configuraciones? Esto activará este complemento dos veces y creará dos archivos JAR con suerte ... –

+0

@dma_k Siguiendo su sugerencia, tratando de generar tres JAR, los dos primeros se sobreescriben con la última configuración ''. – anon

+0

Intente jugar con la opción de configuración '' (marque [aquí] (http://maven.apache.org/plugins/maven-assembly-plugin/howto.html)). –

Respuesta

18

yo no era capaz de resolver este problema con la maven-assembly-plugin de una manera satisfactoria, así que fuimos para una solución diferente. He utilizado el onejar-maven-plugin:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

¿no deberían los dos 'id's en las dos' ejecuciones' ser diferentes? Mi experto se queja si tengo la misma identificación más de una vez. –

+0

@AndreHolzner: Sí, esto fue un error –

+1

en mi humilde opinión, lo mismo es posible con maven-assembly-plugin. Consulte la respuesta de @ donal-fellows – Gabriel

19

Puedes hacerlo. Necesitará una ejecución separada para cada artefacto que está construyendo (es decir, le dará a cada uno su propia identificación, pero puede salir de la fase por defecto), y deberá especificar el Nombre final y el archivo/manifiesto/clase principal para cada.

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

Probablemente también debería declarar explícitamente que se debe usar el objetivo 'único'. –

+3

al probar esta solución y la que se [publicó aquí] (http://stackoverflow.com/a/15799254/288875), parece que también es necesario agregar las etiquetas '' y ''. –

+0

Edité la publicación (esperando la revisión por pares) para incluir objetivos y etiquetas de fase. – Gabriel

1

Para especificar un poco más respuesta anterior que era muy útil para mí, necesita añadir paquete de fase y montaje meta y ejecutar mvn ejecutar el paquete limpio, pom es el siguiente:

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

El objetivo 'assembly 'está en desuso. Ver [información del complemento] (https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html). Mejor usar 'single' en su lugar. – Gabriel

6

The top answer obras si no está utilizando cualquier configuración (o cualquier recurso, para el caso) que obtiene a empujones en el archivo jAR (por ejemplo, la configuración de Spring Framework auto-fijaciones).

Afortunadamente, esta solución también funciona con maven-shade-plugin y no tiene ese problema antes mencionado con onejar-maven-plugin.

También, maven-shade-plugin se mantiene activamente en comparación con onejar-maven-plugin que está en el purgatorio que es googlecode.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
Cuestiones relacionadas