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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Q&A

解決済

3回答

1154閲覧

Javaでデータベースを実行できません。

faiyar

総合スコア0

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

0グッド

0クリップ

投稿2020/11/08 16:23

編集2020/11/09 00:20

前提・実現したいこと

初投稿です。
質問の仕方や内容等ご指摘いただければ幸いです。
やさしいJava 活用編 第6版を使い、Java言語を勉強中です。
データベースを学習していて
ソースファイルはコンパイルできたのですが、クラスファイルはエラーが出て実行できません。

エラーの原因をなぜなのか突き止めて
クラスファイルを実行できるようにしたいです。
ファイルの配置等は教科書通りにしています。

お分かりになられる方いらしゃいましたらご教授ください。
よろしくお願い致します。

ディレクトリ階層
C

┗Program Files

┗━━Java

┣derby.jar
┗jdk-14.0.2

┗━━bin
┗Sample1.class

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

C:\Program Files\Java\jdk-14.0.2\bin>java Sample1
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/derby/shared/common/security/SystemPermission
at org.apache.derby.iapi.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:134)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at Sample1.main(Sample1.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.derby.shared.common.security.SystemPermission
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 4 more

該当のソースコード

import java.sql.*; public class Sample1 { public static void main(String args[]) { try{ //接続の準備 String url = "jdbc:derby:cardb;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES (2, '乗用車')", "INSERT INTO 車表 VALUES (3, 'オープンカー')", "INSERT INTO 車表 VALUES (4, 'トラック')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //データの取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); while(rs.next()){ for(int i=1; i<=cnum; i++){ System.out.print(rm.getColumnName(i) + ":"+ rs.getObject(i) + " "); } System.out.println(""); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } }

試したこと

NoClassDefFoundErrorの意味を調べました。
Java実行時にクラスファイルやライブラリを読み込むクラスローダが、クラスを見つけられない時に発生するエラーであると認知しました。
CLASSPATHを設定してderby.jarを読み込むようにしているのですが、
それでもクラスファイルを実行できないので困っています。

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

OS:windows10
実行環境:コマンドプロンプト

Open JDk
バージョン:jdk-14.0.2

Apache Derby
バージョン:db-derby-10.15.1.3

ユーザー環境変数:
Path
C:\Program Files\Java\jdk-14.0.2\bin;
CLASSPATH
C:\Program Files\Java\derby.jar;C:\Program Files\Apache Software Foundation\Tomcat 9.0\lib\servlet-api.jar;.;

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

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

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

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

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

m.ts10806

2020/11/08 22:26

コードはマークダウンのcode機能にてご提示ください
faiyar

2020/11/09 00:20

ご指摘いただきありがとうございます。 編集中に誤って削除していたようです。修正致しました。
guest

回答3

0

エラーメッセージは、例外が発生した事が最初に書かれていて、そこから遡った実行の履歴が続いています。

at Sample1.main(Sample1.java:14)

が履歴の一番下に書かれていますから、Sample1.javaの14行目に注目しまう。

Sample1.javaの空白行を除いた14行目を見ると下記のコードがあります。

DatabaseMetaData dm = cn.getMetaData();

データ型が”DatabaseMetaData”となっていますが、”DatabaseMetaData”クラスを定義しているコードは質問の「該当のソースファイル」に見当たりません。

でも、コンパイルエラーは出ていないので、

import java.sql.*;

でインポートされているライブラリで定義されているのだろうと推測することが出来ます。

そこで、"java.sql DatabaseMetaData" を検索語にしてWeb検索すると以下のページが見つかりました。

インタフェースDatabaseMetaData 

DatabaseMetaDataはインターフェースであって、クラスではありません。
先に述べたように「該当のソースファイル」にも、DatabaseMetaDataのクラス定義はありません。
そのため、NoClassDefFoundError([直訳]クラスの定義が見つからないエラー)が出た訳です。

ここまでが、エラーが出た原因を探っていく作業の概要です。
今後、NoClassDefFoundErrorが出た場合に参考にしてください。

質問の問題は、DatabaseMetaDataクラスを定義することで解決します。

DatabaseMetaDataインタフェースに従って、必要となるメソッドなどを含めたDatabaseMetaDataクラスの定義を「該当のソースファイル」に追加してみてください。

がんばってください!

投稿2020/11/09 01:27

coco_bauer

総合スコア6915

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

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

faiyar

2020/11/09 09:01

ご回答ありがとうございます。 鼓舞までしていただいてありがたいです。 エラーの意味とエラーが出た後解法に至るまでのプロセスを 丁寧にご説明いただき参考になります。 しかし コンパイルできた事実からインポートされたライブラリに定義されている予測が立つなら、 ライブラリで定義されているので、DatabaseMetaData型の変数は使えるように思えます。 なぜソースファイルでも定義しなければならないのでしょうか?
momon-ga

2020/11/10 07:04 編集

ん?あってそうで微妙に間違ってますよね・・・ ※上記補足:エラーがでるまでの流れの考え方は、あってますが対処が > 質問の問題は、DatabaseMetaDataクラスを定義することで解決します。 というのは、違います そもそも、14行目は Connection cn = DriverManager.getConnection(url, usr, pw); > Caused by: java.lang.ClassNotFoundException: org.apache.derby.shared.common.security.SystemPermission とあるので、org.apache.derby.shared.common.security.SystemPermissionの入ったJarをライブラリに追加(既回答の通り)すれば良いのですよね?
faiyar

2020/11/09 11:51

ご回答ありがとうございます。 たしかにderbyshared.jarにSystemPermissionクラスのクラスファイルがありました。 どのクラスが見つけられなかったのかエラー文に書いてあるにも関わらず、理解できてなかったことが今回の質問に至った原因であると今では考えられます。 今後はエラー文の内容を吟味できるように理解を深めていきます。ありがとうございました。
coco_bauer

2020/11/09 12:16

質問のエラーメッセージの前半("at Sample1.main(Sample1.java:14)"の行まで)については、回答した通りです。 "at Sample1.main(Sample1.java:14)"と"Caused by: java.lang.ClassNotFoundException: org.apache.derby.shared.common.security.SystemPermission"の間には、Exceptionが起きた旨の記述があったのではないかと思われます。 また、エラーメッセージの最後の数行(... 4 more の部分)が省略されているので、プログラムのどこを実行した際に問題が生じたのか判りません。 エラーメッセージの全文を質問に追加して下さい。どこも変更せず、何も省略せずに。
faiyar

2020/11/09 13:23

申し訳ありません、 エラーメッセージはコマンドプロンプトに表示された内容をコピーペーストしたものです。 意図して変更、省略したわけではありません。 省略された内容を表示させようとしましたが、やり方を調べてもわかりませんでした。
xebme

2020/11/09 21:29

スタックトレースを手掛かりにderbyのソースコードを読みます。 AutoloadedDriver.java:134を実行しようとしている。 InternalDriver.embeddedDriverAcceptsURL(url) このクラスInternalDriverが依存する以下のクラスが見つからない。 org.apache.derby.shared.common.security.SystemPermission コネクションを取る過程で例外が起きていることがわかります。
xebme

2020/11/09 21:37

derby.jarを展開してMANIFEST.MFを見るとクラスパスがあります。 Class-Path: derbyshared.jar ... 省略 このクラスパスは、JVMに指定するクラスパスと関連があるのでしょうか?ここからderbyshared.jar を見に行かないのでしょうか?
faiyar

2020/11/10 09:20

クラスパスをderby.jarだけに設定して、derby.jarと同じディレクトリにderbyshared.jarとderbytools.jarを配置した状態でもコンパイル、実行することができました。 同じディレクトリに配置されていなかったので、derby.jarのクラスパスからderbyshared.jarに辿り着けずエラーが出たみたいです。
xebme

2020/11/10 10:11

自己解決してください。
guest

0

お手元に、derbyshared.jar、derbytools.jarといったファイルもありますでしょうか。
あるようでしたら、これらもクラスパスに追加してみてください。

投稿2020/11/09 01:23

plasticgrammer

総合スコア629

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

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

faiyar

2020/11/09 11:42 編集

ご回答ありがとうございます。 ご指摘いただいた2つjarファイルもクラスパスに追加したところ プログラムを実行することができました。
guest

0

自己解決

エラーが出た原因はコネクションを得るのに必要なSystemPermissionクラスが参照できなかったことでした。derby.jarと同じディレクトリにderbyshared.jarを配置すること、またはクラスパスにderbyshared.jarを追加することで解決しました。

投稿2020/11/10 11:34

faiyar

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問