2015-09-14 11 views
7

Il mio progetto Maven è così e io ho un file nella cartella quartz.properties/src/main/resources come illustrato di seguitoCome creare un jar eseguibile usando maven?

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

Ora voglio fare un jar eseguibile utilizzando Maven modo che io possa correre in questo modo java -jar abc.jar. Qui di seguito è il mio codice principale metodo che funziona bene nel mio computer portatile nel mio IDE Eclipse, ma voglio farlo funzionare sulla mia macchina Ubuntu usando java -jar comando:

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)); 
    } 
} 

Ed ecco il mio file pom.xml fin d'ora. Quali modifiche devo avere nel mio file pom.xml per creare un jar eseguibile in modo che possa essere eseguito 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> 
+0

Davvero una domanda ben formata a proposito. – Craig

+0

Cerca SO prima di postare. – Raedwald

risposta

13

È possibile configure vaso Maven plugin per raggiungere questo obiettivo.

Prova ad aggiungere dopo appena sopra dipendenze sezione:

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

Qui, <addClasspath>true</addClasspath> aggiungerà le voci classpath per il manifesto del vostro vaso, così finché si dispone di quei vasi nella stessa directory, l'applicazione in grado di funzionare .

È possibile personalizzare il percorso della libreria con, ad esempio, <classpathPrefix>lib/</classpathPrefix>. Significa che le tue librerie devono essere collocate nella relativa directory /lib.

È anche possibile utilizzare il plugin di dipendenza Maven se si desidera copiare automaticamente le librerie nella directory di output.

+0

Grazie. Ho anche bisogno di 'maven-dependency-plugin'? Ho dipendenza da varie altre librerie, alcune open source e alcune interne. – user1950349

+0

@ user1950349 Ho aggiornato la risposta. – Amila

+0

qualcosa è strano, ho provato la tua strada e ho fatto 'mvn clean install' che ha generato un file jar e ho usato quel file e l'ho eseguito e ho ricevuto questo errore' java.lang.NoClassDefFoundError '-----' Eccezione in thread "main" java.lang.NoClassDefFoundError: org/quartz/SchedulerException in java.lang.Class.getDeclaredMethods0 (Native Method) '. – user1950349

2

In realtà ti basta aggiungere

<packaging>jar</packaging> 

per l'intestazione, in altre parole:

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

Poi, quando si richiama sulla riga di comando assicuratevi di includere il nome completo della tua classe, in questo modo:

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

Il vantaggio di questo è che è possibile più file di classe wi i metodi main() che possono essere eseguiti in un file .jar.

è anche possibile includere il suggerimento di @Amila in modo da non dover includere il nome quando si esegue il vaso, ma dovrete usare questa sintassi invece:

java -jar NameOfFile.jar

0

a seconda di quello che sarà finire nel file jar o cosa è necessario per eseguirlo, probabilmente non è così facile. C'è una buona collezione qui: How can I create an executable JAR with dependencies using Maven?

Vorrei aggiungere Spring-Boot a quella lista. Hanno creato un plugin Maven per raggiungere questo obiettivo, incluso un classloader in grado di leggere i file jar all'interno di un file jar.

C'è anche il plugin schermo maven. A seconda di ciò che fai potrebbe funzionare o potrebbe diventare ingombrante (se ci sono barattoli firmati per esempio).