質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.19%

JavaからのMySQLサーバーへの接続でClassNotFoundExceptionになってしまう

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 422

rito_19514

score 13

前提・実現したいこと

・JavaプログラムからのMySQLサーバー接続
・コンパイル時のエラーは起きないが、mysqlのドライバを定義(?)した時に
ClassNotFoundExceptionが出てしまう。

発生している問題・エラーメッセージ

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at com.gmail.rotoyutoriapp.newSQL.<init>(newSQL.java:22)
        at com.gmail.rotoyutoriapp.Player.SQLOrder.newPlayerData(SQLOrder.java:13)
        at com.gmail.rotoyutoriapp.Player.NewPlayer.newPlayerID(NewPlayer.java:12)
        at com.gmail.rotoyutoriapp.onEnableProcessing.onEnable(onEnableProcessing.java:18)
        at com.gmail.rotoyutoriapp.Main.main(Main.java:11)
java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

該当のソースコード

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.lang.Exception;

public class newSQL {

    public Connection objCon = null;
    public Statement statement = null;
    public boolean isConnect = false;

    public newSQL() {
        String dbName = ServerProperty.dbName;//DB名
        String user = ServerProperty.userName;//ユーザ名
        String pass = ServerProperty.pass;//パスワード

        try {
            //JDBCドライバを
            Class.forName("com.mysql.jdbc.Driver");
            //接続開始 localhost:61229 は、各PCの接続ポート、IPを指定する
            objCon = DriverManager.getConnection(
                    "jdbc:mysql://" + ServerProperty.ip + ":3306/" //接続開始
                            + dbName + "?useSSL=false",
                    user, pass);
            statement = objCon.createStatement();
            isConnect = true;
            System.out.println("DBへの接続成功");
        } catch(Exception objEx) {
            //err
            getLogger.info("ドライバロード失敗");
            objEx.printStackTrace();
            System.err.println(objEx.getClass().getName() + ":" + objEx.getMessage());
            isConnect = false;
        }
    }

    public void close() {
        try {
            this.objCon.close();
            System.out.println("DBへの接続を切断");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
import com.gmail.rotoyutoriapp.newSQL;
import com.gmail.rotoyutoriapp.getLogger;
import com.gmail.rotoyutoriapp.Exception;

import java.sql.SQLException;

public class SQLOrder {
    public static boolean newPlayerData(String uuid) {
        try {
            getLogger.info("プレイヤーデータをSQLに登録します。");
            newSQL sql = new newSQL();
            String command = "INSERT INTO `players` (`UUID`, `playerName`) VALUES ('" + uuid + "', NULL');";
            //String command = "INSERT INTO `reports` (`id`, `time`, `username`, `uuid`, `naiyou`) VALUES (NULL, CURRENT_TIMESTAMP, '" + playername + "', '" + uuid + "', '" + naiyou + "');";
            int result = sql.statement.executeUpdate(command);
            sql.close();
            return true;
        } catch (SQLException e) {
            Exception.SQLException("SQLOrder(Player)","newPlayerData");
            return false;
        }
    }
}
import java.util.UUID;
import com.gmail.rotoyutoriapp.*;

public class NewPlayer {
    public static void newPlayerID() {
        getLogger.info("プレイヤーIDを生成します...");
        String uuid = UUID.randomUUID().toString();
        getLogger.info("プレイヤーID生成完了");
        getLogger.info("ID:" + uuid);
        SQLOrder.newPlayerData(uuid);
    }
}
import com.gmail.rotoyutoriapp.Player.NewPlayer;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class onEnableProcessing {
    static void onEnable() {
        try {
            InetAddress localAddress = InetAddress.getLocalHost(); //IPを取得
            getLogger.info("現在のローカルIP:" + localAddress); //取得したIPを表示
            Maintenance.onCheck(); //メンテナンス状態を確認
            CreateFiles.serverProperty(); //サーバープロパティファイルの作成
            CheckFiles.NotificationDirectoryCheck(); //お知らせディレクトリの存在を確認
            getLogger.info("サーバーが起動しました。");
            ServerProperty.getProperty(); //サーバープロパティを取得
            NewPlayer.newPlayerID();
            Main.onInputCommands(); //コマンド入力待機モード
        } catch (UnknownHostException e) {
            getLogger.info("IP取得エラー");
            getLogger.info("UnknownHostException");
            getLogger.info("クラス:onEnableProcessing");
        }
    }
}
<?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.gmail.rotoyutoriapp</groupId>
    <artifactId>GameServer</artifactId>
    <version>1.0</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.gmail.rotoyutoriapp.Main</mainClass>
                            <addClasspath>true</addClasspath>
                            <addExtensions>false</addExtensions>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>


    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
        </dependency>
    </dependencies>

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

</project>
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        getLogger.info("ゲームサーバー起動処理開始...");
        onEnableProcessing.onEnable();

    }

    static void onInputCommands() {
        System.out.print(">");
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        SaveLogs.saveLog(">" + input);
        commands(input);
    }

    static void commands(String command) {
        if (command.equalsIgnoreCase("stop")) { //サーバーの停止
            commands.stop();
        } else if (command.equalsIgnoreCase("setMaintenance")) { //メンテナンスモードを設定
            commands.SetMaintenance();
        } else if (command.equalsIgnoreCase("checkMaintenance")) { //メンテナンスモードを確認
            commands.maintenanceCheck();
        } else if (command.contains("brc ")) { //運営からのお知らせコマンド(brc  があれば)
            String contains = command.replace("brc ", ""); //brc を空白に置き換え
            SaveNotification.onSave(contains);
        } else if (command.equalsIgnoreCase("help")) {
            commands.help();
        } else {
            getLogger.info("コマンドが間違っています。");
            getLogger.info("helpでヒントを表示します。");
        }
        onInputCommands();
    }
}

試したこと

・pom.xmlのdependencyのartifactIDをmysqlにしてみたりmysql-connector-javaにしてみたが変わらず
・ドライバのURLをcom.microsoft.sqlserver.jdbc.SQLServerDriverやorg.h2.Driverに変えてみた
・forNameをしなくても良いという情報があったため、forNameを削除した
・Class.forName("com.mysql.jdbc.Driver").newInstance();に変えてみたりしたが変わらず

補足情報(FW/ツールのバージョンなど)

開発ソフト - Intellij IDEA
Mavenプロジェクト
開発PC
OS: Windows10 home

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • A-pZ

    2019/05/14 00:30

    > asahina1979さん
    Connector-J8.0系でも非推奨ながらクラスはありますね。

    キャンセル

  • A-pZ

    2019/05/14 00:36

    > rito_19514さん

    pom.xmlを見た限りでは、Javaを実行して起動するクラスはSQLOrderではなく、Mainクラスのようです。
    Mainクラスの実行はどのように行っているのでしょうか。

    キャンセル

  • rito_19514

    2019/05/14 21:49

    A-pZさん
    Mainクラスのコードを記載しました。
    確認をお願い致します。

    キャンセル

回答 1

0

いくつか書かれていないクラスがあるのでそこにも問題があるのかもしれませんが、以下の2点が懸念されます。

  • pom.xmlにてJavaのバージョンが正しく利用されていないので、デフォルト(1.5)が使われている
  • SQLOrderのSQL文に誤りがある

以下のpom.xmlでとりあえずMainクラスは起動でき、データベースへの接続はできましたので、お試しください

<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.gmail.rotoyutoriapp</groupId>
    <artifactId>GameServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>8</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.gmail.rotoyutoriapp.Main</mainClass>
                            <addClasspath>true</addClasspath>
                            <addExtensions>false</addExtensions>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
        </dependency>
    </dependencies>
</project>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/16 20:17

    A-pZさん
    pom.xmlを上記のものに変更しましたが、エラーは変わらないです。
    SQL文が間違っている場合は、SQLExpetionが起きると思うのでSQL構文の間違いの可能性は少ないと考えました。
    SQL文の確認も行いましたが、間違いも発見することができませんでした。
    他にこのエラーを解決する方法はわからないでしょうか?
    教えていただけると嬉しいです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる