2016-07-30 14 views
2

Ich habe ein Maven 3.3-Projekt, und der Hauptausgang ist eine Krieg-Datei:Maven Projekt Verpackung ist Krieg, sondern auch den Aufbau/Installation jar

<artifactId>pro</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>war</packaging> 

ich das Maven bin mit Plugin auch eine JAR-Datei zu erstellen, was geht in und das funktioniert.

Ich möchte dieses Glas mit der lokalen Maven-Repo installieren, so dass ich bin mit dem Maven Plugin installieren, dies zu tun:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.5.2</version> 
    <configuration> 
     <classifier>jar</classifier> 
     <packaging>jar</packaging> 
     <file>target/pro-1.0-SNAPSHOT.jar</file> 
    </configuration> 
    <executions> 
     <execution> 
      <id>do-jar-install</id> 
      <phase>install</phase> 
      <goals> 
       <goal>install</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Die ganze Build funktioniert gut, außer dem Glas installieren Schritt die installiert Krieg, und nicht das Glas. Wie überschreibe ich dies?

Ich suche hier, um zu sehen, was ich verwenden kann: http://maven.apache.org/plugins/maven-install-plugin/examples/installing-secondary-artifacts.html

Hier ist das Protokoll von meinem Build:

**

Gebäude jar:/Users/mike/code

/workspace/pro/target/pro-1.0-SNAPSHOT.jar

[INFO] --- maven-install-plugin: 2.5.2: Installation (do-jar-install) @ pro

[INFO] Installieren von /Users/mike/code/workspace/pro/target/pro-1.0-SNAPSHOT.jar unter /Users/mike/.m2/repository/net/mikeski/pro/1.0-SNAPSHOT/pro-1.0 -SNAPSHOT.war

Beachten sie die letzte Zeile - es ist Kommissionierung der jar, aber ein Krieg

Installation, wie ich das beheben kann?

Wie gewünscht, hier ist die Glas-Plugin config:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
      <id>create-jar</id> 
      <phase>install</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Es schafft ein Glas der Dateien in dem Projekt, und es ist das richtige Glas. Wenn ich den Krieg kopiere, der in meinem Repo zu einem Glas angebracht wird (also ändere ich gerade die Erweiterung) mein anderes Projekt kann es gerade gut aufnehmen.

Antwort

3

Ihre aktuelle Ausgabe ist das Ergebnis mehrerer Überlegungen, von denen eine maven-jar-plugin in Version 2.4 zu freizügig ist.

Zuallererst müssen Sie daran denken, dass in einem Maven-Repository alle Artefakte eine einzige Namenskonvention teilen, die artifactId-version(-classifier).packaging ist. Das bedeutet, dass unabhängig vom lokalen Namen der Datei, die Ihr Build erstellt (foo.jar), diese installiert wird und mit diesem konventionellen Namen bereitgestellt wird. Alles, was wichtig ist, wenn Artefakte installiert werden, sind die Maven coordinates, d. H. Die groupId, die artifactId, die Version, der Klassifikator und die Verpackung.

Was hier geschieht, ist:

  1. Ihr Projekt hat eine Verpackung war.Beim Ausführen von Maven mit mvn install wird zuerst die default-install-Phase aufgerufen, und das Ziel maven-install-plugin:install wird ein erstes Mal ausgeführt und Ihr WAR-Projekt wird installiert. Auf Ihre Protokolle, finden Sie:

    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ test-war --- 
    [INFO] Installing ...\test-war\target\test-war-0.0.1-SNAPSHOT.war to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.war 
    [INFO] Installing ...\test-war\pom.xml to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.pom 
    
  2. Dann verwenden Sie das maven-jar-plugin:jar Ziel, eine JAR-Datei zu erstellen. Dieses Plugin erstellt eine JAR für das aktuelle Maven-Projekt - also wird es in Ordnung erstellt, aber die Maven-Koordinaten dieses neuen Artefakts sind genau die gleichen wie die Ihres WAR-Projekts (Sie haben keine classifier angegeben). Daher ersetzen Sie die Datei des Hauptartefakts (die eine WAR ist) durch eine JAR-Datei: Sie erhalten eine lokale Datei mit der Erweiterung jar (weil die maven-jar-plugin es auf diese Weise erstellt hat), die die Datei der Hauptprodukt eines Maven-Projekts der Verpackung war. Ziemlich verwirrend.

    Denken Sie daran, dass ich sagte, dass die maven-jar-plugin war zu freizügig? Wenn Sie auf die Version 3.0.2 des Plug-ins aktualisieren, wird eine Fehlermeldung angezeigt hier (MJAR-198):

    Sie haben einen Klassifikator zu verwenden, zusätzliche Artefakte zu dem Projekt zu befestigen, anstatt sie zu ersetzen. -> [Hilfe 1]

    was fasst, was oben gesagt ist.

  3. Schließlich haben Sie eine andere Ausführung der maven-install-plugin namens do-jar-install, die diese lokale JAR-Datei installieren soll, deklariert. Und das ist es, was es tut: es installiert die lokale JAR-Datei in Ihrem target-Ordner in Ihrem lokalen Maven-Repository mit den Koordinaten des Artefakts. Die Verwirrung kommt von der Tatsache, dass die Art (Verpackung) des Artefakts in der Tat IST ist, so was installiert wird ist eine WAR-Datei (die effektiv eine JAR) ...


jetzt, dass wir habe das Thema erklärt, die Frage ist: Was willst du machen? Es sieht so aus, als ob du deinem WAR-Projekt ein zusätzliches Artefakt anhängen möchtest, das aus den Klassen besteht. Diese Konfiguration ist nicht erforderlich. Sie können einfach den Parameter attachClasses der maven-war-plugin verwenden.

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
    <attachClasses>true</attachClasses> 
    </configuration> 
</plugin> 
+0

Danke, was ich wirklich brauchte, war zu tun separat meine Einheiten und Schnittstellen zu einer separaten Maven-Modul und dass Projekte in beide verwenden. Dies ist die richtige Antwort auf die Frage, aber nicht die Lösung für mein Problem. – mikeb

0

Sie haben das, weil doppelte Aufruf von Plug-in:

  1. Ausführungsphase
  2. Paket - default Phase

Wenn es keinen guten Grund ist und alles, was Sie interessiert, ist zu haben nur ein JAR als Artefakt aus dem Projekt, benutze eins unter ihnen.

so etwas wie:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <outputDirectory>${outputDirectory}</outputDirectory> 
     </configuration> 
</plugin>