Laden der Hibernate Cfg in .jar

HerrInfo

Mitglied
Hallo zusammen,

ich habe ein kleines Managementsystem geschrieben und möchte nun ein lauffähiges Programm daraus machen, das ohne JRE läuft. Dafür muss jedoch zunächst die .jar-Datei funktionieren. In dieser tritt ein Fehler auf, der in der IDE (IntelliJ) nicht auftritt.

Code:
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at java.desktop/javax.swing.SwingWorker.get(SwingWorker.java:612)
        at net.tim.Main$1.done(Main.java:24)
        at java.desktop/javax.swing.SwingWorker$4.run(SwingWorker.java:749)
        at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:847)
        at java.desktop/sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
        at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:857)
        at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
        at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
        at net.tim.tsdb.DB_Manager.<init>(DB_Manager.java:14)
        at net.tim.Main$1.doInBackground(Main.java:15)
        at net.tim.Main$1.doInBackground(Main.java:12)
        at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:305)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:342)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.Configuration
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 9 more

Ich denke, es liegt daran, dass Hibernate die Konfigurationsdatei nicht findet. Diese befindet sich jedoch im Ressourcenordner und wird mit
Java:
configuration.configure(Objects.requireNonNull(getClass().getResource("/hibernate.cfg.xml")));
geladen.

Vielen Dank im Voraus für eine schnelle Antwort.
 

Oneixee5

Top Contributor
Es liegt NICHT daran, dass die Konfigurationsdatei nicht gefunden wird. Es liegt am Classpath. Für die Ausführung des JAR's muss der Classpath genauso verfügbar/angegeben sein, wie in der IDE.
 

KonradN

Super-Moderator
Mitarbeiter
Dafür muss jedoch zunächst die .jar-Datei funktionieren.
Wie erstellst Du denn die jar Datei? Wie hast Du die Abhängigkeiten mit eingebunden?

Der Stacktrace sagt ja recht deutlich, dass das Problem eine fehlende Klasse ist:
ava.lang.ClassNotFoundException: org.hibernate.cfg.Configuration

Somit scheint Hibernate im Classpath zu fehlen. Also muss entweder die Abhängigkeit mit vorhanden sein als jar Datei und der classpath im Manifest gesetzt sein oder Du musst eine "fat jar" bauen, d.h. die jar Datei enthält auch alle Abhängigkeiten.
 

HerrInfo

Mitglied
Die JAR-Datei wird über den Maven-Lifecycle erstellt, und ich habe Hibernate einschließlich der Konfigurationsklasse über eine Abhängigkeit in Maven eingebunden. Siehe Pom.xml:
Code:
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.tim</groupId>
    <artifactId>TS-System</artifactId>
    <version>1.0</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>net.tim.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.4.4.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
       
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.2</version>
            <scope>test</scope>
        </dependency>


    </dependencies>

</project>

Habe ich richtig verstanden, dass bei der Erstellung einer JAR-Datei diese Abhängigkeiten ignoriert werden?
 

KonradN

Super-Moderator
Mitarbeiter
Habe ich richtig verstanden, dass bei der Erstellung einer JAR-Datei diese Abhängigkeiten ignoriert werden?
Nein, die Abhängigkeiten werden nicht ignoriert. Aber es wird auch nichts weiter damit gemacht. Es wird lediglich eine JAR gebaut mit den Inhalten deines Projekts und es wird ein Manifest mit classpath und main class erstelt.

Hier evtl. einfach einmal als kleiner Hinweis: Eine jar Datei ist auch nur vom Format her eine ZIP Datei. Du kannst Dir also im Detail ansehen, was das Ergebnis Deines Projektes ist. Du kannst Dir also das Manifest ansehen und dann schauen, was da eigentlich enthalte ist. Nach meiner Erfahrung ist es immer besser, im Detail zu verstehen, was eigentlich passiert um dann aktiv eingreifen zu können.

Um erst einmal das Manifest zu verstehen, ist evtl. Understanding the JAR Manifest File | Baeldung hilfreich.

Wenn Du in das Manifest in Deinem JAR schaust, wirst Du die Abhängigkeiten einfach aufgelistet vorfinden. Also etwas wie:
Class-Path: somedependencie.jar someotherdependencie.jar

Das heisst, Du brauchst bei deinem jar File noch diese beiden jar files.

Um das zu bekommen, könntest Du im Maven Projekt auch die Abhängigkeiten kopieren lassen. Dazu könntest Du das maven-dependency-plugin verwenden.

Eine andere Möglichkeit könnte aber auch sein, die Abhängigkeiten einfach mit in dein jar File zu integrieren. Dann brauchst Du nur noch diese eine jar Datei mtzugeben. Dazu könntest Du das maven-shade-plugin verwenden.
Hier aber noch der wichtige Hinweis: Hier gibt es durchaus ein paar Stolperfallen. So darf man z,B. Signaturen zu entfernen (So eine Abhängigkeit signiert wurde) oder wenn da Services Bestandteil sein, dann muss man das Shade Plugin dies auch behandeln lassen (Wenn ich das richtig gesehen habe, dürfte das notwendig sein für den jdbc Treiber, damit der funktioniert)...

Wenn es um die Weitergabe von fertigen Anwendungen geht, greife ich aber sehr gerne auf JPackage zurück. Wie das in einem Projekt aussehen könnte, habe ich in kneitzel/JavaMavenApp (github.com) mal aufgezeigt. Die Erstellung eines Images ist im Profil Image implementiert, welches neben dem Kopieren der Abhängigkeiten und der eigentlichen jar Datei auch den jpackage Aufruf enthält:

XML:
        <profile>
            <id>Image</id>
            <activation>
                <property>
                    <name>Image</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <!-- Copy dependencies -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>${maven.dependency.plugin}</version>
                        <executions>
                            <!-- copy dependencies for the classpath -->
                            <execution>
                                <id>copy-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <includeScope>runtime</includeScope>
                                    <overWriteReleases>false</overWriteReleases>
                                    <overWriteSnapshots>false</overWriteSnapshots>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>

                            <!-- Copy the project jar -->
                            <execution>
                                <id>copy</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>copy</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <artifactItems>
                                        <artifactItem>
                                            <groupId>${project.groupId}</groupId>
                                            <artifactId>${project.artifactId}</artifactId>
                                            <version>${project.version}</version>
                                            <type>${project.packaging}</type>
                                            <destFileName>${project.build.finalName}.jar</destFileName>
                                        </artifactItem>
                                    </artifactItems>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>

                    <!-- Create the image -->
                    <plugin>
                        <groupId>com.github.akman</groupId>
                        <artifactId>jpackage-maven-plugin</artifactId>
                        <version>${jpackage.maven.plugin}</version>
                        <configuration>
                            <name>${appName}</name>
                            <type>IMAGE</type>
                            <mainclass>${main.class}</mainclass>
                            <input>${project.build.directory}/modules</input>
                            <mainjar>${jar.filename}.jar</mainjar>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>install</phase>
                                <goals>
                                    <goal>jpackage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
 

HerrInfo

Mitglied
Habe noch weiter recherchiert und jetzt eine Fat-JAR mit dem Maven Assembly Plugin erstellt. Nun sieht mein POM wie folgt aus:
XML:
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.tim</groupId>
    <artifactId>TS-System</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.4.4.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.2</version>
            <scope>test</scope>
        </dependency>


    </dependencies>

    <build>
        <finalName>TS-System</finalName>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.6.0</version>

                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>net.tim.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>

                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>

            </plugin>

        </plugins>
    </build>

</project>
So funktioniert es auch. Nebenbei, gibt es einen Weg in Hibernate, eine JProgressBar mit dem Verbindungsfortschritt zu verknüpfen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Laden einer Datei vom Netzlaufwerk mit LDAP-Authentifizierung Frameworks - Spring, Play, Blade, Vaadin & Co 3
J Resolver für XML Schema Location beim Laden des Spring Application Context Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Wie kann ich im Tomcat ResourceBundle über JPA + Spring laden Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Persistierung in Hibernate(SpringBoot) Frameworks - Spring, Play, Blade, Vaadin & Co 2
padde479 org.hibernate.query.sqm.UnknownEntityException Frameworks - Spring, Play, Blade, Vaadin & Co 12
OnDemand Jasypt Hibernate 6 alternative gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
D org.hibernate.LazyInitializationException Frameworks - Spring, Play, Blade, Vaadin & Co 2
krgewb Hibernate - deleteByXXX Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Postgres, Hibernate Seqencenummer wird wiederholt und verursacht PK-Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z JPA, Hibernate, Postgres und Sequence-Nummern Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Hibernate Lazy Collection löschen Frameworks - Spring, Play, Blade, Vaadin & Co 7
H Hibernate Sql Abfrage loggen Spring mit log4j.properties Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand DTO <> Entity Hibernate Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 28
S Spring JPA / Hibernate: save Methode arbeitet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
R Spring Data: Hibernate liest nicht alle Ebenen Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Data Hibernate mehrfache Suchkriterien Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot, Hibernate und OAuth2 wie komme ich an den User? Frameworks - Spring, Play, Blade, Vaadin & Co 13
D Spring Hibernate Struts2 ? Frameworks - Spring, Play, Blade, Vaadin & Co 1
F JPA org.hibernate.LazyInitializationException / Spring @Transactional Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Spring, Hibernate und JPA in einem Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 4
I Nachladen mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
N MAVEN + Spring + JPA + Hibernate + JUnit4 Frameworks - Spring, Play, Blade, Vaadin & Co 5
E Tomcat mit Hibernate und Spring - Problem mit Connection Pool Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Context initialization failed - mit Spring, JPA, Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B Buchempfehlung für Groovy, Spring, Hibernate, SOAP, J2EE gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Hibernate - Spring Roo Frameworks - Spring, Play, Blade, Vaadin & Co 0
Dit_ Springsource Toolsuit | Hibernate intergration Frameworks - Spring, Play, Blade, Vaadin & Co 1
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
D [InvalidDataAccessApiUsageException] Spring Data JPA / Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B SpringMVC-EntityManagerFactory-Hibernate-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Problem mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 0
R Projektübergreifende Entities mit Tomcat (Spring/JPA/Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 2
N Wie manage ich unter Spring mehrere Datenbankverbindung mit Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 6
Y Sessionmanagement (ThreadLocal) in Hibernate via Spring möglich? Frameworks - Spring, Play, Blade, Vaadin & Co 2
C Aufgabe in OSGI/Hibernate/Spring-DM Frameworks - Spring, Play, Blade, Vaadin & Co 4
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring / Jpa / Hibernate -> java.lang.IllegalArgumentException: Unknown entity Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Hibernate und JDBC über Spring Frameworks - Spring, Play, Blade, Vaadin & Co 3

Ähnliche Java Themen


Oben