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

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

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

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

Java

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

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Q&A

解決済

2回答

4892閲覧

JDBCライブラリをMavenのBuildに含めたい

__kk

総合スコア14

JDBC

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

Java

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

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

0グッド

0クリップ

投稿2017/11/16 16:06

IntelijでMavenを使用してJDBC(Mysql)を含めてbuildしたいです。

そこでmaven shade pluginを使用し、依存関係に書いてあるmysql:mysql-connector-javaをincludeしました。(versionは5.1.44)
しかしbuildをし、実行してみたところcom.mysql.jdbc.Driverが見つからないと表示され、buildしたものを解凍してみたところ.porject以外のソースは含まれていませんでした。

解決方法を教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

投稿2017/11/16 23:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

__kk

2017/11/17 07:54 編集

参考にさせていただき<minimizeJar>true</minimizeJar>をfalseに変更したところbuildにライブラリが含まれるようになりました。 ありがとうございます。
guest

0

訂正2:度々すみません。本回答は取り消します。

asahina1979さん回答をみて自分の実験方法自体が間違っていることに気づきました。以下はmaven shade pluginを用いる方法(pom.xmlにMavenの依存関係を定義する方法?)ではなくIDEAに最初から含まれているMaven Integration pluginを用いてGUIでMavenによる依存ライブラリーをプロジェクトへ追加する方法での実験でした。JDBC Driverのロードについても、JARの生成方法についてもおお外ししていた回答でした。大変失礼いたしました。


実験しただけなので正しいかどうか確信はないのですが・・・

JDBCのサンプルコードを見ると大抵

リスト1:

java

1public class ApplicationMain { 2 public static void main(String[] args) { 3 try { 4 Class.forName("com.mysql.jdbc.Driver").newInstance(); 5 ... 6 } catch (Exception e) { 7 e.printStackTrace(); 8 } 9 } 10}

のように明示的にjdbcドライバーを参照せずに実行時に解決しようとしています。これはアプリケーションにmysqlをバンドルしたくないためだと思います。あなたがアプリケーションをGPL(GNU General Public License)で配布、あるいはコマーシャルライセンスを購入するなどしてmysqlの二次配布を許可されている前提ですと、上記のようなことはする必要がなく直接以下のようにしてよいはずです。

リスト2:

java

1public class ApplicationMain { 2 private static Class<?> mysqlDriver = com.mysql.jdbc.Driver.class; 3 public static void main(String[] args) { 4 ... 5 } 6}

このようにした上でCreate JAR from Modulesでartifactsを生成する際に「JAR files from libraries」の「extract to the target JAR」にチェックを入れておけば生成されたJARの中にmysqlのjarも展開された状態で含まれるようにできると思います。リスト1のように直接参照しない状況では「extract to the target JAR」にチェックを入れても「参照していないクラスは必要ない」と判断されるのかJARには含まれないようでした。


追記・訂正:
asahina1979さんからご指摘をいただきましたように、本回答の例は現在は標準的な方法ではなく、(充分調べられてないですが)JVMへのプロパティーjdbcDriverNameやdataSourceNameあるいはjava.sql.DriverManagerを介して実行時に利用者が任意のベンダーのDBMSを選択できるようにすることが可能になっているようです。上の回答でクラスローダーにドライバー名を明示することが標準的な方法であるかのようにコメントしましたが、ここでその誤りを訂正してお詫びさせていただきます

本件については2つのポイントがあると思います。

(1) JDBCのロードに失敗していること自体
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-connect-drivermanager.html
を参照しますと,接続に必要な配慮について記載されてますが、(DBMS非依存の接続方法である)java.sql.DriverManagerを用いるか、またはクラスローダーに明示的にドライバークラスを指定する点とCLASSPATHにドライバーのjarのパスを含めることなどが記述されています。本件ではcom.mysql.jdbc.Driverが見つからないというエラーとのことなので上記いずれの方法にせよ(ドライバークラスは適切に設定されているようですので)CLASSPATHにJDBCドライバーが設定されていないことが原因であると思います。

(2) 本アプリケーションがmysqlに依存したものとして開発したい(mysql JDBC ドライバーを再配布することでの利用者の利便性もかねて)という場合のJARへ同梱するための方法。(元の回答はその想定の下での同梱方法になります)同梱するとCLASSPASSの問題はおこらないと思います。

取り急ぎ訂正まで。

投稿2017/11/16 18:00

編集2017/11/17 00:50
KSwordOfHaste

総合スコア18392

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

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

退会済みユーザー

退会済みユーザー

2017/11/16 23:21

いまはその手続き(forName)は不要になってますよ
KSwordOfHaste

2017/11/16 23:31

そうなのですか!間違いを訂正しておきます。ご指摘ありがとうございました。 いずれにせよクラスを明示的に参照しない方法でアクセスしているのですよね?本件の要点は明示的に参照しないとJARに含まれないらいしいという点ですが、その点はいかがでしょうか?
退会済みユーザー

退会済みユーザー

2017/11/16 23:43 編集

多分別の方法(プラグインの設定)で対処できるとおもう。 リスト1のは間違えているというより古いやり方です。
KSwordOfHaste

2017/11/16 23:52

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/toc.htm や他のDBベンダーの仕様をみていますが、jdbcDriverNameプロパティーにドライバー名を実行時に指定したり、dataSourceNameプロパティーでDBMSの種類に依存しない論理的なソース名を指定することで回答に書いたような「特定のドライバーに依存したプログラムにする必要はない」ということですね!なるほどこれは調べるまで知りませんでした!asahina1979さんのご指摘はこのような点を指しているということで認識あってますでしょうか? いずれにせよ本件はJARに「特定のドライバーを含める」ということはポイントではなく、単純にドライバーを適切にロードできない点のみに着目したアドバイスにすべきということですね?
KSwordOfHaste

2017/11/17 00:43

情報ありがとうございます。なるほどこういう仕様があるのですね。mysqlのマニュアルにはjava.sql.DriverManagerを使った例とかClass.forNameを使った例など記載されててその情報から中途半端に判断してましたが、やはりJDBC自体の大元の仕様から確認すべきでしたね。重ね重ねありがとうございました。
KSwordOfHaste

2017/11/17 00:56

ご指摘いただいた点の他に根本的にやりかたが間違っていたのに気づきましたのでその旨回答を訂正しました。 情報・ご指摘ありがとうございました。>asahina1979さん おかしな回答してしまい大変失礼しました。>質問者さん他のみなさま みなさんには申し訳なかったのですが、おかげさまで自分は勉強させていただきました。スミマセン!
__kk

2017/11/17 07:33

作成しているものは配布する予定がなくライセンスは購入していない状況です。 回答ありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問