without the proyecto generate generar ejecutar ejecutable create crear con compiling java maven jar classloader

java - the - maven generate jar



¿Cómo hacer un jar ejecutable usando maven? (3)

Mi proyecto de maven es así y tengo un archivo quartz.properties en la carpeta /src/main/resources como se muestra a continuación

my-app |-- pom.xml `-- src |-- main | |-- java | | `-- com | | `-- mycompany | | `-- app | | `-- App.java | `-- resources | `-- quartz.properties `-- test |-- java `-- com `-- mycompany `-- app `-- AppTest.java

Ahora quiero crear un archivo ejecutable utilizando maven para poder ejecutarlo así java -jar abc.jar . Debajo está mi código de método principal que funciona bien en mi computadora portátil en mi eclipse IDE, pero quiero ejecutarlo en mi máquina ubuntu usando el comando java -jar :

public static void main(String[] args) { StdSchedulerFactory factory = new StdSchedulerFactory(); try { factory.initialize(App.class.getClassLoader().getResourceAsStream("quartz.properties")); Scheduler scheduler = factory.getScheduler(); scheduler.start(); } catch (SchedulerException ex) { System.out.println("error= " + ExceptionUtils.getStackTrace(ex)); } }

Y aquí está mi archivo pom.xml partir de ahora. ¿Qué cambios necesito tener en mi archivo pom.xml para crear un archivo ejecutable para poder ejecutarlo con java -jar ?

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.host.domain</groupId> <artifactId>DataPlatform</artifactId> <version>4.2.8-RELEASE</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>abc</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.3.1</version> </dependency> </dependencies> </project>


En realidad, solo necesitarás agregar

<packaging>jar</packaging>

a su encabezado, en otras palabras:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.host.domain</groupId> <artifactId>DataPlatform</artifactId> <version>4.2.8-RELEASE</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>abc</artifactId> <version>1.0.0</version> <!-- This is where the magic happens --> <packaging>jar</packaging>

Luego, cuando invoque en la línea de comando, asegúrese de incluir el nombre completo de su clase, como este:

java -cp NameOfFile.jar com.mycompany.app.App

La ventaja de esto es que puede tener múltiples archivos de clase con métodos main() que se pueden ejecutar en un archivo .jar.

También puede incluir la sugerencia de @Amila para que no tenga que incluir el nombre al ejecutar el jar, pero en su lugar deberá usar esta sintaxis:

java -jar NameOfFile.jar


Puede configurar el plugin maven jar para lograr esto.

Intenta agregar la siguiente sección de dependencias justo arriba:

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.mycompany.app.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>

Aquí, <addClasspath>true</addClasspath> agregará entradas classpath al manifiesto de su jar, por lo que siempre que tenga esos <addClasspath>true</addClasspath> jar en el mismo directorio, su aplicación se ejecutará correctamente.

Puede personalizar la ruta de la biblioteca con, por ejemplo, <classpathPrefix>lib/</classpathPrefix> . Significa que sus bibliotecas deben colocarse en el directorio relative /lib .

También puede usar el complemento de dependencia maven si quiere copiar automáticamente sus bibliotecas al directorio de salida.


dependiendo de qué terminará en el archivo jar o qué se requiere para ejecutarlo, probablemente no sea tan fácil. Aquí hay una buena colección: ¿cómo puedo crear un JAR ejecutable con dependencias usando Maven?

Agregaría Spring-Boot a esa lista. Han creado un plugin maven para lograr esto, que incluye un cargador de clases que puede leer archivos jar dentro de un archivo jar.

También está el plugin maven shade. Dependiendo de lo que haga, podría funcionar o puede ser engorroso (si hay frascos firmados, por ejemplo).