Eclipse Maven package mit dependencies

razr

Mitglied
Hi,

aktuell versuche ich ein Maven2-Projekt, das ich erstellt habe, zu einem "Standalone"-Jar zu machen.

Ich habe dort aber einige Dependencies genutzt (hsqldb-2.2.6, junit4.9, log4j-1.2.14). Wenn ich das nun zu einer JAR exportier (maven: clean, comnpile, package) und dann versuche auszuführen bekomme ich folgenden Fehler:

Code:
$ java -jar target/MEINESOFTWARE.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/xml/DOMConfigurator
        at Log.Log.<init>(Log.java:39)
        at Log.Log.getLog(Log.java:154)
        at Persistence.Persistence.<init>(Persistence.java:50)
        at Persistence.Persistence.getPersistence(Persistence.java:284)
        at Start.main(Start.java:28)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.xml.DOMConfigurator
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 5 more

Es sieht für mich so aus, als würden die Dependencies nicht mit gepackt... Im JAR-File ist da auch nichts drin...

Kann mir da jemand helfen?

Gruß raz0r
 
Im Gegensatz zu Ears oder Wars unterstützt das Jar-Format es nicht, andere Jars mit reinzupacken. Darüber stolpert man gerne, wenn man vorher nur mit ears oder wars gearbeitet hat. Es gibt für dieses Problem zwei mögliche Lösungen:
  1. Entpacke alle dependencies und schmeiß alles in einem Riesen-Jar zusammen.
  2. Richte Dir eine Ordnerstruktur ein (bspw Programmverzeichnis mit Unterverzeichnis "lib") und liefere Deine anwendung als Zip-Datei aus.
Für beide Varianten kann man das Assembly-Plugin konfigurieren. Infos gibts hier: Maven Assembly Plugin - Introduction
 
Hallo,

um ein Jar zu erhalten, dass alle Abhängigkeiten enthält gibt es das Maven Shade Plugin, dass erzeugt ein sog. ueber-jar ...

BTW: Warum rufst Du "maven: clean, comnpile, package" auf?

Wenn Du hier
Code:
mvn clean package
Aufrufst wird auch compiliert...Ist Dir der Life-Cycle von Maven ein Begriff ?

Gruß
Karl Heinz Marbaise
 
Ersteinmal vielen Dank für die Anleitungen und Hilfen.

Ich habe jetzt folgendes meiner pom.xml hinzugefügt:

Code:
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.3</version><!--$NO-MVN-MAN-VER$-->
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>GUI.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Jetzt packt er mir das Programm nahezu richtig zusammen.

Ich habe jetzt einzig das Problem, dass er mir einige Ordner nicht mit packt. Ich habe einen Ordner, der die Sprachdateien des Projekts und einen, der die Bilder des UI enthält.

Ich habe schon versucht diese dem classpath mit hinzuzufügen, aber auch das bringt nichts (hab ich mir aber auch fast gedacht). Wenn ich die Ordner von Hand einfüge funktioniert das. Das sollte ja aber nicht der richtige Weg sein, oder?

@kama ja, ist mir ein Begriff, nur da das nicht funktioniert hat, habe ich gedacht, ich probier erstmal alles was vieleicht Sinn ergeben könnte 😉
 
Hallo,
Code:
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.3</version><!--$NO-MVN-MAN-VER$-->
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>...
Ja assembly plugin ist auch eine Möglickeit..

Ich habe jetzt einzig das Problem, dass er mir einige Ordner nicht mit packt. Ich habe einen Ordner, der die Sprachdateien des Projekts und einen, der die Bilder des UI enthält.
Und wo liegen die Dateien ? src/main/resources ? .. ?Warscheinlich nicht...

@kama ja, ist mir ein Begriff, nur da das nicht funktioniert hat, habe ich gedacht, ich probier erstmal alles was vieleicht Sinn ergeben könnte 😉
Liegt aber einfach daran, dass Du kein entsprechendes Plugin in den Life-Cycle gepackt hast ...

Gruß
Karl Heinz Marbaise
 
ich habe jetzt (fast) alles versucht... ich hab sie im Ordner src/main/resources gehabt, im Ordner src/main/resources/img, hab diese dem classpath hinzugefügt etc.

ich rufe die Bilder per

Java:
logo = new JLabel(new ImageIcon("logo.png"));

Das Einzige, was funktionierte war, wenn ich die mit

Java:
logo = new JLabel(new ImageIcon("src/main/resources/img/logo.png"));

abgerufen habe, wurden sie beim start direkt aus eclipse angezeigt. Nach dem package waren sie zwar in dem jar-file, wurden aber nicht angezeigt.

Was mache ich denn jetzt noch falsch?
 
Hi,

wenn Du die Dateien in Maven unter src/main/resources legst dann werden die in das JAR eingepackt und dann dort per:

Java:
this.getClass().getResource("/img/logo.png")
or
this.getClass().getResourceAsStream("/img/logo.png")
zu erreichen.
Das klappt dann sowohl von Eclipse aus als auch im gepackten Programm...

Gruß
Karl Heinz Marbaise
 
Vielen vielen Dank kama !!

Da ist man schon so in dem Trott, dass man doch glatt in allen Anleitungen den führenden Slash übersieht ... Und ich wunder mich, dass ich so komische Fehlermeldungen bekomme -.-

Vielen Dank für die sehr gute und schnelle Hilfe 😉

Gruß razr
 

Zurück
Oben