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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3672閲覧

VSCodeでDBと接続しSQL実行するJavaプログラムを作成したい

Tomo0225

総合スコア67

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2022/11/10 15:05

編集2022/11/19 15:23

VSCodeでローカルのSQLServerに接続してSQLを実行するプログラムを作成したいです。
最初にVSCodeのCreate Java Projectコマンドでプロジェクトを作成し、下記のSQLDatebaseConnectionクラスを作成しました。
このコードを実行すると

java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver

というエラーが発生します。

JDBCを追加していなかったためsetting.jsonにmssql-jdbc-11.2.0.jre18.jarを追加しました。
そしてコードを実行すると下記のエラーが発生してしまいます。

エラー: メイン・クラスSQLDatabaseConnectionを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: SQLDatabaseConnection

JDBCを追加しただけでエラー内容が変わる理由も理解できませんしどこに問題があるのかも分からない状況です。
お知恵をお貸しください。

追記:
Javaのバージョン情報
>>java -version 
openjdk version "18.0.2.1" 2022-08-18
OpenJDK Runtime Environment (build 18.0.2.1+1-1)
OpenJDK 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

SQLDatabaseConnection

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.ResultSet; 4import java.sql.Statement; 5 6public class SQLDatabaseConnection { 7 8 public static void main(String[] args) { 9 String connectionUrl = "jdbc:sqlserver://localhost;databaseNmae=WideWorldImporters;user=sa;password=Password123;encrypt=true;trustServerCertificate=true;"; 10 ResultSet resultSet = null; 11 12 try ( 13 Connection connection = DriverManager.getConnection(connectionUrl); 14 Statement stmt = connection.createStatement(); 15 ) 16 { 17 String insertSQL = "UPDATE WideWorldImporters.Application.Cities SET CityName = 'java' WHERE CityName = 'test';"; 18 String checkSQL = "SELECT TOP 10 * FROM WideWorldImporters.Application.Cities"; 19 stmt.executeUpdate(insertSQL); 20 resultSet = stmt.executeQuery(checkSQL); 21 22 while (resultSet.next()) { 23 System.out.println(resultSet.getString("CityName")); 24 } 25 } 26 catch (Exception e) { 27 e.printStackTrace(); 28 } 29 } 30}

settings.json

1{ 2 "java.jdt.ls.java.home": "C:\\Users\\yasue\\scoop\\apps\\openjdk18\\current", 3 "java.project.sourcePaths": ["src"], 4 "java.project.outputPath": "bin", 5 "java.project.referencedLibraries": { 6 "include": [ 7 "lib/**/*.jar", 8 "c:\\jar\\sqljdbc_11.2.0.0_jpn\\sqljdbc_11.2\\jpn\\mssql-jdbc-11.2.0.jre18.jar" 9 ] 10 } 11}

launch.json

1{ 2 "version": "0.2.0", 3 "configurations": [ 4 { 5 "type": "java", 6 "name": "Launch Current File", 7 "request": "launch", 8 "mainClass": "${file}" 9 }, 10 { 11 "type": "java", 12 "name": "Launch SQLDatabaseConnection", 13 "request": "launch", 14 "mainClass": "SQLDatabaseConnection", 15 "projectName": "SQLDatabaseConnection_3a354dfc" 16 } 17 ] 18}

「デバッグなしで実行」を押したときにコンソールに表示されるコマンドとエラーです。

PS C:\work\SQLDatabaseConnection> & 'C:\Users\user\scoop\apps\openjdk18\current\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '@C:\Users\user\AppData\Local\Temp\cp_3rmdcs7y0uwbacgs3k0ag3apr.argfile' 'SQLDatabaseConnection'

エラー: メイン・クラスSQLDatabaseConnectionを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: SQLDatabaseConnection
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Crimson_Tide

2022/11/11 01:15

・コンパイル・実行はどのようにして実施しましたか? ・SQLDatabaseConnection.classファイルがbinフォルダにあるでしょうか? ・コンパイル・実行に使用したJDKは18以上になっていますか?
Tomo0225

2022/11/12 11:06

実行はVSCodeのメニュータブの「実行」の「デバッグなしで実行」から実行しました。 binフォルダにSQLDatabaseConnection.classはできています。 入っているJDKが11だったのでJDBCのバージョンは11に修正しましたがエラー内容は変わりませんでした。
Crimson_Tide

2022/11/13 14:17

同様の環境を構築してみましたが、java.lang.ClassNotFoundExceptionは出ませんでした。 現在Gradleベースで試行されているようですので、本件はクローズということでよいのでしょうか?
Tomo0225

2022/11/13 14:36

そうなのですね。ありがとうございます。 別のところに問題があるということが分かったので他を探ってみます。 Gradleは苦肉の策であり、依然この問題には取り組んでいるため質問は閉じないでおきたいと思います。
Crimson_Tide

2022/11/13 14:44

該当ソースはVSCode上でエラー表示などないでしょうか? VSCodeの再起動、classファイルを削除し、実行後再作成されているかの確認を試してみてください。 また掲載のコードと現状のコードに差異がないことも確認してください。(package文の記述の有無など) エクスプローラータブでフォルダ内のファイル構成がわかるように展開した状態と該当ソースを表示した状態のスクリーンショットの掲載をお願いします。
Tomo0225

2022/11/13 15:19

>VSCodeの再起動、classファイルを削除し、実行後再作成されているかの確認を試してみてください。 試しましたがエラー変わりませんでした。
Crimson_Tide

2022/11/13 18:12

確認ですが実行は「実行」の「デバッグなしで実行」を実施してエラーが出ているのですよね? ターミナルに実行時のコマンドとエラーメッセージが表示されると思うので、コピーして質問欄に追記をお願いします。 合わせて、launch.jsonの内容も追記お願いします。 サイドバーの「実行とデバッグ」タブで再生マークの横の文字列を教えてください。 その上で環境変数のCLASSPATHを削除し、OS再起動して実行を試してみてください。
Crimson_Tide

2022/11/17 16:02 編集

現状考えられる原因として2点 [1]CLASSPATHがmssql-jdbc-11.2.0.jre18.jarに限定されてしまって他の.classファイルが見えてない [2]何らかの原因でbinフォルダ内の.classが認識されていない [1]環境変数CLASSSPATHを定義しても、VSCodeで敢えて変数を読み込ませない限り影響はなさそう(ただ現状の設定は好ましくない&必要性を感じないので削除したほうがいい。例えばコマンドラインでjava クラス名を実行しようとするとCLASSPATHしか見ないのでClassNotFoundExceptionが発生する)。 [2]は手元の環境で再現できたケースは、Configure Classpathでoutputのbinフォルダを再定義した際フォルダ内のファイルが削除される→実行するとClassNotFoundException発生。 検証のため、一度Create Java Project-[No build tools]で新規プロジェクトを作成し、特に何もせずデフォルトで作成されているApp.javaを実行してみてください。 ※修正 問題なく実行できれば、srcフォルダにSQLDatabaseConnection.javaをコピーしライブラリにJDBCドライバーのjarを追加はしないで実行してみてください。 エラーが出ると思うのでその時の実行時のコマンドとエラーメッセージを掲載してください。 その後、ライブラリにJDBCドライバーのjarを追加し実行してください。 エラーが出るようなら実行時のコマンドとメッセージの掲載をお願いします。 ※修正 App.javaは実行できるが、SQLDatabaseConnectionがエラーの場合は、App.javaに以下を追加し実行。結果を教えてください。 System.out.println("classpath : " + System.getProperty("java.class.path"));
Tomo0225

2022/11/17 17:03

CLASSPATHは削除し、新しいフォルダでCreate Java Project-[No build tools]をし、新規プロジェクトを作成してApp.javaを実行したところ問題なく実行できました。 >>問題なく実行できれば、srcフォルダにSQLDatabaseConnection.javaをコピーしライブラリにJDBCドライバーのjarを追加はしないで実行してみてください。 SQLDatabaseConnection.javaを実行したところ出力はこのようになりました。 PS C:\user\work\SQLDatabaseConnection> c:; cd 'c:\user\work\SQLDatabaseConnection'; & 'C:\Users\user\scoop\apps\openjdk18\18.0.2.1-1\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'C:\user\work\SQLDatabaseConnection\bin' 'SQLDatabaseConnection' java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;encrypt=true;database=WideWorldImporters;integratedSecurity=true; その後ライブラリにjarを追加して実行したところコンソールの出力はこのようになりました。 PS C:\user\work\SQLDatabaseConnection> & 'C:\Users\user\scoop\apps\openjdk18\18.0.2.1-1\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '@C:\Users\user\AppData\Local\Temp\cp_3g9cw19am175zye1n7szu10wy.argfile' 'SQLDatabaseConnection' com.microsoft.sqlserver.jdbc.SQLServerException: ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした。エラー: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"。 ClientConnectionId:72ff9c30-5abe-4221-8b29-ed8d674339ab App.javaの実行結果はこのようになりました。 PS C:\user\work\SQLDatabaseConnection> & 'C:\Users\user\scoop\apps\openjdk18\18.0.2.1-1\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '@C:\Users\user\AppData\Local\Temp\cp_3g9cw19am175zye1n7szu10wy.argfile' 'App' Hello, World! classpath : C:\user\work\SQLDatabaseConnection\bin;c:\jar\sqljdbc_11.2.0.0_jpn\sqljdbc_11.2\jpn\mssql-jdbc-11.2.0.jre18.jar 現在見たことないエラーメッセージについて調べていますがもしかしてjarが読み込めているでしょうか。 また不思議に思って今まで使用していたフォルダで一旦既存のプロジェクトを削除して、Javaプロジェクトを新規作成して同じようにApp.javaを実行してみたら、そちらはClassNotFindエラーが発生しAppが読み込めませんと言われました。 プロジェクトを配置するフォルダ特有の問題の可能性があるかもしれません。
Crimson_Tide

2022/11/17 18:01

jar自体はライブラリに[Referenced Libraries]に追加した時点で読み込めています。 ClassNotFoundException:はjar読み込みとは別問題ですが、SQLDatabaseConnection.classを読み込んで処理をしているようなので、プロジェクト作成し直しで解決したように思われます。 SQLServerExceptionはSQLServer接続時の問題でしょう。SQLServer側の設定もあるかもしれませんし別途対応して頂きたい。 フォルダの違いとは以下の違いでしょうか? C:\work\SQLDatabaseConnection C:\user\work\SQLDatabaseConnection 新規作成してもエラーが出るのであれば、launch.jsonかsettings.jsonの違いぐらいでしょうか。 必要であればエラーがないか、差異がないか確認してみてください。
Tomo0225

2022/11/18 12:34

あれから検証してみたところ以前使用していたフォルダで一旦プロジェクトを削除し新規でプロジェクトを作成しApp.javaを実行したところ問題なく実行できました。SQLDatabaseConnection.javaを追加し実行すると”java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;encrypt=true;database=WideWorldImporters;integratedSecurity=true;”というエラーが発生します。そしてReferenced Librariesにjarを読み込んでから実行するとClass not Findエラーが発生し、App.javaすら実行できなくなりました。 そこでsettings.jsonの"java.project.referencedLibraries": の中にに追加されている"c:\\jar\\sqljdbc_11.2.0.0_jpn\\sqljdbc_11.2\\jpn\\mssql-jdbc-11.2.0.jre18.jar"の行をコメントアウトすると、Class not Findエラーがでなくなり実行できるようになります。 しかし検証のため以前使用していたフォルダとは別のフォルダに新規でプロジェクトを作成して上記と同じ手順を踏むと、jarを追加する前までは全く同じエラーを出し、jarを追加すると、App.javaは実行できClassNotFoundExceptionエラーは発生しませんでした。そしてSQLDatabaseConnectionは1つ上のコメントに記載したcom.microsoft.sqlserver.jdbc.SQLServerExceptionが発生します。 それぞれプロジェクトを見比べてみましたがsettings.jsonなども差がありませんでした(一旦プロジェクトを削除し、同じ手順で作成している)。 使用しているフォルダのパスは下記のような感じです。文字の種類構成だけあわせて表記しました。 C:\user\HoGe\Hogeホゲ\HOGE\hoge.01\SQLDatabaseConnection(最初から使用していた方) C:\work1\SQLDatabaseConnection(検証で使った方) ただwok2の方なら動かせそうなので当面はcom.microsoft.sqlserver.jdbc.SQLServerExceptionの解決のための調査をしていきます。
Crimson_Tide

2022/11/18 14:39 編集

ソースのあるフォルダのパスにマルチバイトがパスに含まれている 且つ ライブラリを追加 →ClassNotFoundException フォルダのパスにマルチバイトがパスに含まれているライブラリ(jar)を追加 →当該jarを読み込めない ライブラリを追加することでクラスパスが'@C:\Users\username\AppData\Local\Temp\cp_(不特定の文字列).argfile' に記述され実行時の引数として利用されています。 文字コード若しくはjava.exeの関係でマルチバイトを理解できず当該パスを認識できないことで起こっていた現象と思われます。 パスをマスクする際意識せずに日本語部分を変換してしまったのかもしれませんが、問題解決の妨げになりかねません。今後質問でパスなどマスクする際はユーザー名など最低限に留めて頂いたほうがよいでしょう。 パスにマルチバイトがあると開発では往々にしてトラブルの元ですので、最低でも全角文字を含むパスを利用するのはやめましょう。(半角英数と"-" と"_" ぐらいが無難です)
Tomo0225

2022/11/18 14:48

原因まで教えていただきありがとうございます。フォルダパスが問題だったこと理解できました。 次回からフォルダ名に気を付けたいと思います。
Tomo0225

2022/11/19 15:19

「ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした」というエラーですがconnectionURLにencrypt=true;trustServerCertificate=true;の文字列を追加することで解消しました。 またSQL文やprepareStatementをcreateStatementに変更するなど多少の修正を以てDB接続からSQL実行までできることが確認できました。 数日に渡り検証までしてくださり大変、ありがとうございました。
guest

回答1

0

自己解決

ClassNotFoundExceptionの原因は、プロジェクトの置いてあるフォルダのパスに日本語が入っていたせいで、実行時に文字コードの関係でエラーになっていたようです。
教えて下さりありがとうございました。

投稿2022/11/19 15:27

Tomo0225

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問