2010-01-07 20 views
77

Ich bin relativ neu in dem Maven-Mantra, aber ich versuche, mit Maven ein lauffähiges Run-Glas zu bauen. Ich habe meine Abhängigkeiten eingerichtet, aber wenn ich mvn install ausführen und versuchen, den Jar auszuführen, passieren zwei Dinge. Erstens wird keine Hauptklasse gefunden, die korrigierbar ist. Wenn ich das korrigiert habe, bekomme ich Fehler beim Ausführen, dass Klassen nicht gefunden werden können.Erstellen eines lauffähigen Glases mit Maven 2

Maven verpackt meine Abhängigkeitsbibliotheken nicht innerhalb des Jars, daher kann ich das JAR nicht als eigenständige Anwendung ausführen. Wie korrigiere ich das?

+0

Sie können IDE für Maven wie Netbenas – SjB

+7

@SjB verwenden: und das löst auf magische Weise das Problem? Ich denke nicht. –

+1

Genaues Duplikat von was genau? –

Antwort

105

Der einfachste Weg, dies zu tun wäre, eine Baugruppe mit dem maven-assembly-plugin und dem vordefinierten jar-with-dependencies Deskriptor zu erstellen. Sie müssen auch ein Manifest mit einem Hauptklasseneintrag für dieses Uber-JAR generieren. Das Snippet unten zeigt, wie die Assembly-Plugin zu konfigurieren, dies zu tun:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

Dann die Anordnung zu erzeugen, gerade laufen:

mvn assembly:assembly 

Wenn Sie die Baugruppe als Teil Ihres Build generieren möchten , einfach binden das assembly:single mojo zum Paket Phase:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Und einfach laufen:

mvn package 
+1

Das maven-shade-plugin funktioniert ebenfalls ähnlich und ist diesem Zweck gewidmet. –

+4

Dies funktioniert nicht für Spring und andere Bibliotheken, die mehrere Ressourcen mit demselben Namen im Klassenpfad erwarten. Im Fall von Spring ist META-INF \ spring.schemas in mehreren JARs (Beans, JDBC usw.) enthalten und wird verwendet, um XML-Namespace-Unterstützung für den XML-Parser zu konfigurieren. Wenn Sie versuchen, 'jar-with-dependencies' zu verwenden, wird pasing application-context.xml zur Laufzeit mit etwas wie "org.xml.sax.SAXParseException: cvc-elt.1: Die Deklaration des Elements 'beans' nicht finden." –

+0

@David Maven wird eine Java "Beschränkung" nicht lösen. Packen Sie einfach Ihre Anwendung in diesem Fall sauber (d. H. Nicht in einem Uberjar). –

25

Maven verpackt Ihre Abhängigkeiten nicht in Ihre JAR-Datei, da Sie dies normalerweise nicht mit Java-Programmen tun.

Stattdessen liefern Sie die Abhängigkeiten zusammen mit Ihrer JAR-Datei und erwähnen sie in the Class-Path header of the Manifest.

Um diese Route zu gehen, müssen Sie die addClasspath Eigenschaft (dokumentiert here) für die maven-jar-plugin aktivieren.

Wenn Sie wirklich alle Ihre Abhängigkeiten in Ihre JAR-Datei aufnehmen möchten, können Sie das Maven Assembly-Plugin verwenden, um eine jar-with-dependencies zu erstellen.

+4

+1 Ich habe es schwer gefunden, Informationen darüber zu finden, wie Java-Programme * in der Regel * erstellt werden sollen und verteilt, vor allem mit Maven. –

6

ich mit Joachim Sauer Agree,

Anstelle der Verwendung von Glas-mit-Abhängigkeit sollte man das Glas Plugin wie das in Ihrer pom.xml konfigurieren:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <index>true</index> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>[mainClassFullName]</mainClass> 
      </manifest> 
      <manifestEntries> 
       <mode>development</mode> 
       <url>${project.url}</url> 
       <key>value</key> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

Und verwenden Sie diese Assembly-Konfiguration Fügen Sie die JAR-Abhängigkeiten zu Ihrer Baugruppe hinzu:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>zip-with-jars</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySets> 
    <dependencySet> 
    <outputDirectory>/</outputDirectory> 
    <useProjectArtifact>true</useProjectArtifact> 
    <unpack>false</unpack> 
    <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
    </dependencySets> 
</assembly> 
8

Dies ist, was ich für kleine Projekte tun würde. Die meiste Zeit willst du kein riesiges Glas.

aufzubauen: MVN saubere Abhängigkeit: copy-Abhängigkeiten Paket

auszuführen (in Ziel-Richt): java -cp myjar.jar: ./ Abhängigkeit/* com.something .MyClass

+0

+1 für einfache verwendet No-Configuration-No-Configuration-Lösung. –

+0

Großartig! Ich habe dies in meinem Makefile gespeichert, im selben Verzeichnis wie pom.xml. build: \ n mvn .... (was du gesagt hast) – Roboprog

+0

Danke. Nach der Suche im Internet für mehr als 2 Stunden fand diese sehr nützliche Antwort .... – Shekhar

2

Fügen Sie einfach den folgenden Code in pom.xml und Ausführen als: maven: install.Das jar wird im Zielordner von eclipse erstellt, der als "java -jar Hello.jar" verwendet werden kann. aber stellen Sie sicher, dass Name der Hauptklasse gegeben com.abc.HelloWorld.java

<build> 
<plugins> 
<plugin> 
<groupid>org.apache.maven.plugins</groupid> 
<artifactid>maven-shade-plugin</artifactid> 
<executions> 
<execution> 
<phase>package</phase> 
<goals> 
<goal>shade</goal> 
</goals> 
<configuration> 
<finalname>HelloW</finalname> 
<transformers> 
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
<manifestentries> 
<main-class>com.abc.HelloWorld.java</main-class> 
<build-number>1</build-number> 
</manifestentries> 
</transformer> 
</transformers> 
</configuration> 
</execution> 
</executions> 
</plugin> 
</plugins> 

</build> 
Verwandte Themen