Keine Verbindung mit MariaDB

Bitte aktiviere JavaScript!
Hallo,

ich bin ziemlich neu in der Java-Welt und würde gerne eine Web-Applikation mit MariaDB aufbauen. Mit Intellij und Tomcat bringe ich die Applikation zum Laufen, erhalte aber die Meldung: java.lang.ClassNotFoundException: org.mariadb.jdbc.Driver

Mein pom.xml beinhaltet:
XML:
<dependencies>
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>1.1.7</version>
    </dependency>
</dependencies>
Mein Code sieht wie folgt aus:
Java:
package ch.yourclick.zt;

import java.sql.*;

public class Database {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.mariadb.jdbc.Driver");

        String host = "localhost";
        String dbname = "zt_productions";
        String url = "jdbc:mariadb://" + host + "/" + dbname;
        String username = "root";
        String password = "test";
        Connection conn = DriverManager.getConnection(url, username, password);

        String query = "SELECT * FROM users";

        Statement st = conn.createStatement();

        st.close();
    }
}
Ich habe alles mögliche schon ausprobiert wie mariadb-java-client-2.4.1-sources.jar manuell in WEB-INF/lib platziert oder mit Class.forName("org.mariadb.jdbc.Driver").newInstance(); aber scheint nichts zu funktionieren. Ich erhalte immer dieselbe Fehlermeldung und fange so langsam an zu verzweifeln. Kann mir jemand bitte weiterhelfen?
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Also die sources jar da rein zu packen wird dir nichts bringen. Wenn, dann willst Du ja die kompilierten Files haben. Also nimm eher das mariadb-java-client-2.4.1.jar.

Oder mach es über Maven mit der aktuellen Version. Wieso hast Du da die 1.1.7 angegeben wo Du doch im Download selbst gesehen hast, dass die 2.4.1 aktuell ist?
Siehe dazu auch einfach https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

Aber etwas wundert mich das dennoch, denn auch bei der 1.1er Version gab es die Klasse org.mariadb.jdbc.Driver. Daher wundert es mich, wieso er da die 1.1.6er Version, die Du da als Dependency drin hast, nicht mitgenommen hat....
 
Also die sources jar da rein zu packen wird dir nichts bringen. Wenn, dann willst Du ja die kompilierten Files haben. Also nimm eher das mariadb-java-client-2.4.1.jar.

Oder mach es über Maven mit der aktuellen Version. Wieso hast Du da die 1.1.7 angegeben wo Du doch im Download selbst gesehen hast, dass die 2.4.1 aktuell ist?
Siehe dazu auch einfach https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

Aber etwas wundert mich das dennoch, denn auch bei der 1.1er Version gab es die Klasse org.mariadb.jdbc.Driver. Daher wundert es mich, wieso er da die 1.1.6er Version, die Du da als Dependency drin hast, nicht mitgenommen hat....
Oh super, vielen Dank kneitzel! Das hat mich schon einen sehr grossen Schritt weitergebracht. Mit mariadb-java-client-2.4.1.jar in WEB-INF/lib scheint es zu funktionieren.

Was Maven angeht, scheint es, dass ich irgendetwas falsch mache. Ich habe nun auch die neueste Version 2.4.1 genommen und auch damit funktioniert es nicht. Falls es dich interessiert, hier findest du das ganze Projekt: https://bitbucket.org/rezasript/zt-productions
 
Was Maven angeht, scheint es, dass ich irgendetwas falsch mache. Ich habe nun auch die neueste Version 2.4.1 genommen und auch damit funktioniert es nicht. Falls es dich interessiert, hier findest du das ganze Projekt: https://bitbucket.org/rezasript/zt-productions
Wenn du ein Web-Project willst, solltest du Maven das auch mitteilen ;)

Gib in der pom.xml zusätzlich das Packaging an, in diesem Fall war: <packaging>war</packaging>.
Der Ordner web sollte dann noch in "webapp" umbenannt in src landen und die jar sollte da raus, dann ist das über Maven baubar.
 
Wenn du ein Web-Project willst, solltest du Maven das auch mitteilen ;)

Gib in der pom.xml zusätzlich das Packaging an, in diesem Fall war: <packaging>war</packaging>.
Der Ordner web sollte dann noch in "webapp" umbenannt in src landen und die jar sollte da raus, dann ist das über Maven baubar.
Hmm, habe ich alles gemacht aber dann komme ich auf eine 404-Seite :/

Type Status Report
Message /ZT_war_exploded/
Bescrheibung The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
 
ALso unter .idea\artifacts habe ich ein ZT_war.xml und ein ZT_war_exploded.xml.

ZT_war.xml
XML:
<component name="ArtifactManager">
  <artifact type="war" name="ZT:war">
    <output-path>$PROJECT_DIR$/target</output-path>
    <properties id="maven-jee-properties">
      <options>
        <module>ZT</module>
        <packaging>war</packaging>
      </options>
    </properties>
    <root id="archive" name="zt-1.0-SNAPSHOT.war">
      <element id="artifact" artifact-name="ZT:war exploded" />
    </root>
  </artifact>
</component>
ZT_war_exploded.xml
XML:
<component name="ArtifactManager">
  <artifact type="exploded-war" name="ZT:war exploded">
    <output-path>$PROJECT_DIR$/target/zt-1.0-SNAPSHOT</output-path>
    <properties id="maven-jee-properties">
      <options>
        <exploded>true</exploded>
        <module>ZT</module>
        <packaging>war</packaging>
      </options>
    </properties>
    <root id="root">
      <element id="directory" name="WEB-INF">
        <element id="directory" name="classes">
          <element id="module-output" name="ZT" />
        </element>
        <element id="directory" name="lib">
          <element id="library" level="project" name="Maven: org.mariadb.jdbc:mariadb-java-client:2.4.1" />
        </element>
      </element>
      <element id="directory" name="META-INF">
        <element id="file-copy" path="$PROJECT_DIR$/target/zt-1.0-SNAPSHOT/META-INF/MANIFEST.MF" />
      </element>
      <element id="javaee-facet-resources" facet="ZT/web/Web" />
    </root>
  </artifact>
</component>
Unter der Konfiguration von Tomcat habe ich als "Deploy at server startup" ZT:war_exploded eingegeben.
 
In Target liegt, wenn du mit Maven baust, eine zt.war. Diese Datei kannst im im Tomcat deployen.

Alles was in .idea liegt, solltest du ignorieren.
 
Dir ist aber schon klar, dass die main-Methode nicht von Tomcat ausgeführt wird, bloß weil Du die Seite aufrufst?
 
Okay ich habe das ganze Projekt jetzt nochmals neu erstellt und nun bekomme ich keine 404-Meldung mehr aber der Wert der Variabel wird mir nicht mehr ausgegeben. Der Browser gibt mir jetzt einfach ${username} aus.

Ich habe es auch damit probiert:
Code:
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
Scheint nichts zu funktionieren.

Was mache ich da falsch? :/
 
Es wundert mich schon, dass das Ding bei Dir überhaupt übersetzt wird. In Deiner pom.xml fehlt die Abhängigkeit von der servlet-api. Um z. B. Version 4.0.1. zu verwenden:
XML:
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
Als nächstes erklärt Deine web.xml, dass die Servlet 2.x Spezifikation verwendet wird. Die kennt keine Annotationen, deshalb wird z. B. Dein Login-Servlet nicht registriert. Schmeiß den DOCTYPE raus und verwende:
XML:
<web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
  <display-name>Archetype Created Web Application</display-name>
</web-app>
Das ist die vollständige web.xml.

Danach sollte es funktionieren.
 
Danke mihe7, das funktionier so bei mir bestens!

Einfach nur damit ich etwas daraus gelernt habe:
Ich verstehe generell nicht den Zusammenhang zwischen pom.xml und web.xml. pom.xml ist von Maven und damit kann ich die Abhängigkeiten definieren. So weit habe ich es verstanden aber weshalb muss ich in pom.xml Servlet definieren aber auch die Spezifikation des Servlets in web.xml??

Und wie genau kommst du zu diesem Code für web.xml? Ich habe etwas mühe damit mir den Code zu merken und ich möchte ihn auch nicht auswendig lernen. Wo genau wird also die Servlet-Spezifikation definiert und braucht es die URLs unbedingt?

Sorry für die dummen Fragen :)
 
Die Fragen sind alles andere als dumm.

Die pom.xml und die web.xml sind zwei völlig verschiedene Dinge. Die pom.xml kümmert sich in erster Linie um das Bauen der Anwendung (via Maven). Ergebnis ist in diesem Fall ein WAR-File. Die web.xml ist dagegen ein Deployment Descriptor, eine Art Konfigurationsdatei, mit der dem Servlet Container (Tomcat) bzw. Application Server bestimmte Sachverhalte bzgl. Deiner Anwendung bekannt gegeben werden.

In der pom.xml gibst Du die Version der Servlet API an, gegen die Du kompilierst. Vielleicht ist Dir die Zeile <scope>provided</scope> aufgefallen. Die Zeile bedeutet, dass gegen die Bibliothek zwar kompiliert, sie aber nicht in das WAR aufgenommen wird, weil sie bereits auf dem Zielsystem vorhanden ist. Das macht bei einem Servlet Container Sinn, denn der implementiert ja gerade diese API.

Da diese Bibliothek nicht mit ausgeliefert wird, kann der Servlet Container auch nicht ermitteln, welche Servlet-Version die Anwendung verwendet. Diese Angabe findet er im Deployment Descriptor (web.xml). Warum gibt es das überhaupt? Ganz einfach: Du kannst eine alte WAR in einem aktuellen Servlet Container laufen lassen.

Und wie genau kommst du zu diesem Code für web.xml? Ich habe etwas mühe damit mir den Code zu merken und ich möchte ihn auch nicht auswendig lernen. Wo genau wird also die Servlet-Spezifikation definiert und braucht es die URLs unbedingt?
Sowas merkt man sich auch nicht. Wenn Du Spaß haben willst: https://javaee.github.io/servlet-spec/downloads/servlet-4.0/servlet-4_0_FINAL.pdf, wenn Du arbeiten willst, dann übernimmt das normalerweise die IDE (bzw. Maven beim Erzeugen eines neuen Projekts) oder man googelt das kurz.

Such einfach nach "servlet 4 deployment descriptor" oder "servlet 4 web.xml", jeweils ohne Anführungszeichen. Dann kommst Du sehr schnell auf Seiten, wo Du den Kopf einfach rauskopieren kannst. Die Quelle für die Schemas: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html

Die im web-app-Element angegebenen Attribute xmlns und xmlns:xsi definieren Namensräume, die in diesem Element verwendet werden. Mit schemaLocation wird mitgeteilt, welche Schemas verwendet werden. Diese Vorgehensweise ist Standard-XML und hat nicht speziell etwas mit Java EE zu tun.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben