without with tutorial the proyecto generar ejecutar ejecutable dependencias create crear con compiling java maven executable-jar maven-assembly-plugin

java - with - snapshot jar



Crear mĂșltiples Jars ejecutables(con dependencias incluidas) de un Ășnico proyecto Maven (4)

Esta pregunta ya tiene una respuesta aquí:

Tengo un único proyecto maven que tiene múltiples clases principales. Quiero generar Jars ejecutables (que incluyan alle depenices) fuera de estos proyectos. Actualmente tengo la siguiente configuración de compilación (usando maven.assembly):

<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 una forma de lograr esto con maven-assembly? Si no, ¿cuál es la forma más sencilla de lograr mi objetivo?


No pude resolver este problema con el maven-assembly-plugin una manera satisfactoria, así que busqué una solución diferente. onejar-maven-plugin 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>


Para especificar un poco más de respuesta previa que fue muy útil para mí, necesita agregar el paquete de fase y el ensamblado de objetivos y ejecutar mvn ejecutar 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>


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

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


La respuesta principal funciona si no está utilizando ninguna configuración (o cualquier recurso, para el caso) que se incluye en su archivo jar (por ejemplo, la configuración de auto-enlaces de Spring Framework).

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

Además, maven-shade-plugin se mantiene activamente en oposición al 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>