Java 抛出“没有合适的驱动程序”异常

Java throws a "No suitable driver" exception

提问人:Ehrenmann 提问时间:11/7/2023 最后编辑:Ehrenmann 更新时间:11/7/2023 访问量:62

问:

我正在尝试将 Java 程序连接到我的 Docker Localhost 上的数据库。 我正在使用 Maven 在 VSCode 中开发以管理我的依赖项。

为此,我将JDBC驱动程序“mariadb-java-client-2.7.3.jar”添加到我的资源文件夹中,并将其包含在pom依赖项中。

尝试运行程序时,它会抛出驱动程序异常:Fehlercode:
0 SQL 状态:08001 java.sql.SQLException:未找到适合 jdbc:mariadb://localhost:3306/aufgabe_4 的驱动程序

我浏览了有关此主题的各种其他问题,并尝试了一些东西,例如在尝试打开连接之前添加
。但是,这会导致另一个异常:
线程“main”java.lang.Error中的异常:未解决的编译问题: 未处理的异常类型 ClassNotFoundException at com.datenbanken.aufgabe4.DBVerbindung.verbinden(DBVerbindung.java:15)
Class.forName("org.mariadb.jdbc.Driver");

如果这个问题已经得到解答,我深表歉意,但我找不到任何适合我的解决方案。

这是我的源代码:

package com.datenbanken.aufgabe4;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBVerbindung {
    private Connection con = null;
    private String dbAdresse = "localhost:3306";
    private String dbInstanz = "aufgabe_4";

    public void verbinden(String nutzer, String passwort) {
        try {
            //Class.forName("org.mariadb.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mariadb://" + dbAdresse + "/"
                    + dbInstanz, nutzer, passwort);
        } catch (SQLException e) {
            ausnahmeAusgeben(e);
        }
    }

    private void ausnahmeAusgeben(SQLException e) {
        while (e != null) {
            System.err.println("Fehlercode: " + e.getErrorCode());
            System.err.println("SQL State: " + e.getSQLState());
            System.err.println(e);
            e = e.getNextException();
        }
    }

    public void verbindungTrennen() {
        if (con == null) {
            System.out.println("keine Verbindung vorhanden");
            return;
        }
        try {
            con.close();
        } catch (SQLException e) {
            ausnahmeAusgeben(e);
        }
    }

    public void verbindungAnalysieren() {
        if (con == null) {
            System.out.println("keine Verbindung vorhanden");
            return;
        }
        try {
            DatabaseMetaData dbmd = con.getMetaData();
            System.out.println("DB-Name: " + dbmd.getDatabaseProductName()
                    + "\nDB-Version: " + dbmd.getDatabaseMajorVersion()
                    + "\nDB-Release: " + dbmd.getDriverMinorVersion()
                    + "\nTransaktionen erlaubt: " + dbmd.supportsTransactions()
                    + "\nbeachtet GroßKlein: " + dbmd.storesMixedCaseIdentifiers()
                    + "\nunterstützt UNION: " + dbmd.supportsUnion()
                    + "\nmax. Prozedurname: " + dbmd.getMaxProcedureNameLength());
        } catch (SQLException e) {
            ausnahmeAusgeben(e);
        }
    }

    public static void main(String[] s) {
        DBVerbindung db = new DBVerbindung();
        db.verbinden("root", "bitnami");
        db.verbindungAnalysieren();
        db.verbindungTrennen();
    }
}

这是我的pom.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>com.datenbanken.aufgabe4</groupId>
    <artifactId>aufgabe4</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependency>
    <groupId>com.datenbanken.aufgabe4</groupId>
    <artifactId>aufgabe4</artifactId>
    <version>2.7.3</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/mariadb-java-client-2.7.3.jar</systemPath>
    </dependency>

</project>

这是我的文件夹结构:

folder structure

EDIT1:更新了pom

<?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>com.datenbanken.aufgabe4</groupId>
    <artifactId>aufgabe4</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client  (Dependency direkt von Maven)-->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>2.7.3</version>
    </dependency>   


</project>
java docker maven jdbc

评论

1赞 David Maze 11/7/2023
您说数据库正在“Docker localhost”上运行。在Docker中,通常每个容器都是自己的。应用程序在哪里运行?数据库?Docker 是如何参与的?localhost

答:

1赞 PeterMmm 11/7/2023 #1

POM说

<scope>system</scope>

而且它不会被包含在罐子里。您必须在容器的设置中提供驱动程序,或使用

<scope>runtime</scope>

为什么您不包括来自 maven central https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/2.7.3 的依赖项?

评论

0赞 Ehrenmann 11/7/2023
感谢您的帮助,我尝试将范围更改为运行时(希望通过仅更改那一行来完成),并且我尝试直接从 maven 中心获取依赖项(我在 EDIT1 下添加了它)。不过,两者仍然会导致“没有合适的驱动程序”错误......您还有其他想法可能导致问题吗?
0赞 Ehrenmann 11/7/2023
对不起,如果这被认为是微不足道的,但我是新手,不知道从哪里开始......
0赞 Basil Bourque 11/7/2023
@Ehrenmann 阅读文档pom.xml 中<依赖>下的<scope> for 是什么?