Maven JAR-File schmeißt NoClassDefFoundError wenn /lib Verzeichnis nicht daneben entpackt wird

  • Themenstarter Themenstarter Gelöschtes Mitglied 16900
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 16900

Gast
Hallo,
hab mit diversen maven-Plugins ein JAR-File gebaut, welches alle Dependencies als jar-Files im lib-Folder enthält und ein passendes MANIFEST.MF File.

Das Problem dabei ist, wenn das lib-Verzeichnis im jar-File selbst ist, schmeißt es mir nen NoClassDefFoundError beim Starten.
Entpack ich das lib-Verzeichnis aus dem jar-File heraus neben das jar-File ist es startbar.

wäre klasse, wenn mir dabei jemand kurz helfen könnte, bzw. Tips geben könnte, was ich machen muss um das problem zu lösen.

aber:Ich möchte nicht das maven-jar-plugin benutzen, welches alle dependencies auspackt!

hier meine pom

[XML]
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<warSourceDirectory>${project.build.directory}</warSourceDirectory>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<mainClass>package1.package2.MainClass</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
<manifestEntries>
<SplashScreen-Image>splash.png</SplashScreen-Image>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/assembly/distribution.xml</descriptor>
</descriptors>
<archive>
<manifestFile>${project.build.directory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>process-resources</phase>
<configuration>
<tasks>
<copy todir="${project.build.directory}/conf">
<fileset
dir="${basedir}/src/main/resources/package1/package2/conf/"
includes="**/*" />
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
[/XML]

hier noch die distribution.xml fürs assembly-plugin

[XML]
<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>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<!-- compilierte Klassen werden dem jar-Archiv hinzugefügt -->
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<!-- Abhängigkeiten werden mit hinzugefügt -->
<directory>${project.build.directory}/lib</directory>
<outputDirectory>/lib</outputDirectory>
</fileSet>
</fileSets>
</assembly>
[/XML]
 
Aber in der MANIFEST.MF stehen doch unter Class-Path alle benötigten libraries drin. ich dachte das reicht... ?!?

Class-Path: lib/JAR1.jar lib/JAR2.jar
lib/JAR3.jar ...


EDIT: Ok, ich hab das Problem verstanden.

Würde denn sowas irgendwie gehen?

Code:
Starter.jar
 + /lib
 + Application.jar
    + /conf
    + /META-INF
    + /package1/package/Main.class
 
Zuletzt bearbeitet von einem Moderator:
Jo, hab ich auch schon nachgelesen.
Ich hab grad den vorherigen Eintrag kommentiert, aber wahrscheinlich geht das dann auch nicht oder?
 
Sehr schön. Dann mach ich mich mal daran noch n bischen was zu bauen! 🙂

Wieso kann ich files/properties, die im conf liegen nicht nachträglich ändern, wenn ich fragen darf?
 
Achso, das ist mir natürlich bewusst.

Andere Frage. Müsste ich dann in dieser Starter.jar noch eine Starter-Klasse anlegen, die "irgendwie" die Application.jar mit java -jar Application.jar aufruft?

Oder was wäre der richtige Weg hier?

Schöne Grüße
Farmy
 
Ah, yeah habs hingekriegt. Hab via Starterklasse aus dem ersten jar die wichtigen Dateien (inklusive inneres jar) in ein projekt-verzeichnis entpackt und da gestartet.

klappt wunderbar via eclipse und jar!

danke!
 

Zurück
Oben