簡體   English   中英

Java ClassNotFoundException,即使在檢查庫中的正確類之后

[英]Java ClassNotFoundException even after checking for correct class in library

我正在嘗試讓Bukkit插件連接到MySQL服務器以存儲數據,但是即使我將連接器放在構建路徑中,它仍然會給出java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Driver在創建准備好的語句的一行中。

我對SQL非常陌生,因此將不勝感激。

onEnable():

@Override
    public void onEnable() {

        try {

            getConnection();

        } catch (Exception e) {

            e.printStackTrace();
            System.out.println("SQL Server connection failed, stopping server");

            Bukkit.getServer().shutdown();

        }

        try {

            String[] names = { "uuid", "cash" };
            String[] types = { "VARCHAR(50) NOT NULL PRIMARY_KEY", "DECIMAL(18,2)" };

            createTable("CashBalance", names, types);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

CREATETABLE():

public static void createTable(String tableName, String[] columnNames, String[] columnTypes) {
    if (tableName != null && columnNames.length > 0 && columnNames.length == columnTypes.length) {
        String SQLmakeTable = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + columnNames[0] + " " + columnTypes[0];
        for (int i = 1; i < columnNames.length; i++) {
            SQLmakeTable = SQLmakeTable + ", " + columnNames[i] + " " + columnTypes[i];
        }
        SQLmakeTable = SQLmakeTable + ")";
        try {
            Connection con = getConnection();
            PreparedStatement tableSend = con.prepareStatement(SQLmakeTable);
            tableSend.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

堆棧跟蹤:

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
[21:04:55 INFO]: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
[21:04:55 WARN]: java.lang.NullPointerException
[21:04:55 WARN]:        at me.TeknoServal.EcoMain.createTable(EcoMain.java:100)
[21:04:55 WARN]:        at me.TeknoServal.EcoMain.onEnable(EcoMain.java:42)
[21:04:55 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:254)
[21:04:55 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332)
[21:04:55 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:402)
[21:04:55 WARN]:        at org.bukkit.craftbukkit.v1_13_R2.CraftServer.enablePlugin(CraftServer.java:421)
[21:04:55 WARN]:        at org.bukkit.craftbukkit.v1_13_R2.CraftServer.enablePlugins(CraftServer.java:347)
[21:04:55 WARN]:        at net.minecraft.server.v1_13_R2.MinecraftServer.l(MinecraftServer.java:571)
[21:04:55 WARN]:        at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:533)
[21:04:55 WARN]:        at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:411)
[21:04:55 WARN]:        at net.minecraft.server.v1_13_R2.DedicatedServer.init(DedicatedServer.java:270)
[21:04:55 WARN]:        at net.minecraft.server.v1_13_R2.MinecraftServer.run(MinecraftServer.java:676)
[21:04:55 WARN]:        at java.lang.Thread.run(Unknown Source)

啟用后,該插件應在SQL數據庫中創建一個新表,但是根本沒有表。

編輯:

連接器版本:mysql-connector-java-8.0.14.jar

測試項目:

public class testing {

    public static void main(String[] args) {

        String[] columns = { "id", "name" };
        String[] types = { "INT NOT NULL PRIMARY KEY AUTO_INCREMENT", "VARCHAR(50)" };
        Object[] things = { 1, "George" };
        String[] updateColumns = { "id", "name" };
        Object[] updateThings = { 3, "Hallo" };
        String[] columnSelect = { "name" };

        createTable("Blah", columns, types);
        insert("Blah", columns, things);
        update("Blah", "id", "1", updateColumns, updateThings);
        select("Blah", "id", "3", columnSelect);

    }

    public static void createTable(String tableName, String[] columnNames, String[] columnTypes) {

        if (tableName != null && columnNames.length > 0 && columnNames.length == columnTypes.length) {

            String SQLmakeTable = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + columnNames[0] + " "
                    + columnTypes[0];

            for (int i = 1; i < columnNames.length; i++) {

                SQLmakeTable = SQLmakeTable + ", " + columnNames[i] + " " + columnTypes[i];

            }

            SQLmakeTable = SQLmakeTable + ");";

            System.out.println(SQLmakeTable);

        }
    }

    public static void insert(String tableName, String[] columnNames, Object[] contents) {

        if (contents.length <= columnNames.length && columnNames.length > 0 && contents.length > 0
                && tableName != null) {

            if (contents[0] != null) {

                String SQLcolumns = "INSERT INTO " + tableName + " (" + columnNames[0];
                String SQLcontents = " VALUES ('" + contents[0] + "'";

                if (columnNames.length >= 2) {

                    for (int i = 1; i < columnNames.length; i++) {

                        if (contents[i] != null && columnNames[i] != null) {

                            SQLcolumns = SQLcolumns + ", " + columnNames[i];
                            SQLcontents = SQLcontents + ", '" + contents[i] + "'";

                        }

                    }

                }

                String SQLmessage = SQLcolumns + ")" + SQLcontents + ");";

                System.out.println(SQLmessage);

            }

        }

    }

    public static void select(String tableName, String idColumn, String id, String[] columnNames) {

        String SQLtable = "SELECT " + columnNames[0];
        String SQLdata = " FROM " + tableName;
        String SQLlocation = " WHERE " + idColumn + " IN (SELECT DISTINCT " + idColumn + " FROM " + tableName
                + " WHERE " + idColumn + " = " + id + ");";

        for (int i = 1; i < columnNames.length; i++) {

            if (columnNames[i] != null) {

                SQLtable = SQLtable + ", " + columnNames[i];

            }

        }

        String SQLmessage = SQLtable + SQLdata + SQLlocation;

        System.out.println(SQLmessage);

    }

    public static void update(String tableName, String idColumn, String id, String[] columnNames, Object[] contents) {

        if (contents.length <= columnNames.length && columnNames.length > 0 && contents.length > 0
                && tableName != null) {

            if (contents[0] != null) {

                String SQLtable = "UPDATE " + tableName;
                String SQLdata = " SET " + columnNames[0] + " = '" + contents[0] + "'";
                String SQLlocation = " WHERE " + idColumn + " = " + id + ";";

                for (int i = 1; i < columnNames.length; i++) {

                    if (contents[i] != null && columnNames[i] != null) {

                        SQLdata = SQLdata + ", " + columnNames[i] + " = '" + contents[i] + "'";

                    }

                }

                String SQLmessage = SQLtable + SQLdata + SQLlocation;

                System.out.println(SQLmessage);

            }

        }

    }

}

測試輸出:

CREATE TABLE IF NOT EXISTS Blah (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
INSERT INTO Blah (id, name) VALUES ('1', 'George');
UPDATE Blah SET id = '3', name = 'Hallo' WHERE id = 1;
SELECT name FROM Blah WHERE id IN (SELECT DISTINCT id FROM Blah WHERE id = 3);

的getConnection():

public static Connection getConnection() throws Exception {

        try {

            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/TestBukkit";
            String username = "javaUser";
            String password = "FunTimesWithJava";
            Class.forName(driver);

            Connection con = DriverManager.getConnection(url, username, password);

            return con;

        } catch (Exception e) {

            System.out.println(e);

        }

        return null;

    }

請檢查連接器jar文件的版本。

更新

我認為使用String SQLmakeTable創建查詢存在問題。 因為在for循環中,每次都會附加““如果不存在則創建表。”。因此,請更正用於創建查詢的邏輯以創建表。

String colDetail = "";

for (int i = 1; i < columnNames.length; i++) {

                colDetail = colDetail+ ", " + columnNames[i] + " " + columnTypes[i];

            }

SQLmakeTable = SQLmakeTable + colDetail + ")";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM