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

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

ただいまの
回答率

90.75%

  • Java

    13133questions

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

  • IntelliJ IDEA

    122questions

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

  • JDBC

    88questions

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

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

解決済

回答 2

投稿

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

kake26s

score 4

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

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/17 16:29 編集

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

    キャンセル

+1

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

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


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

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

リスト1:

public class ApplicationMain {
  public static void main(String[] args) {
    try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      ...
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

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

リスト2:

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

このようにした上で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/17 08:21

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

    キャンセル

  • 2017/11/17 08:31

    そうなのですか!間違いを訂正しておきます。ご指摘ありがとうございました。

    いずれにせよクラスを明示的に参照しない方法でアクセスしているのですよね?本件の要点は明示的に参照しないとJARに含まれないらいしいという点ですが、その点はいかがでしょうか?

    キャンセル

  • 2017/11/17 08:42 編集

    多分別の方法(プラグインの設定)で対処できるとおもう。

    リスト1のは間違えているというより古いやり方です。

    キャンセル

  • 2017/11/17 08:52

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

    いずれにせよ本件はJARに「特定のドライバーを含める」ということはポイントではなく、単純にドライバーを適切にロードできない点のみに着目したアドバイスにすべきということですね?

    キャンセル

  • 2017/11/17 09:35 編集

    ・https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html
    ・https://docs.oracle.com/javase/jp/8/docs/api/java/sql/DriverManager.html
    ・http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/sql/DriverManager.java#501

    java6 で classpath:/META-INF/services 以下に指定のファイルを置くことで自動的にロードするように実装が完成したそうです。

    キャンセル

  • 2017/11/17 09:43

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

    キャンセル

  • 2017/11/17 09:56

    ご指摘いただいた点の他に根本的にやりかたが間違っていたのに気づきましたのでその旨回答を訂正しました。

    情報・ご指摘ありがとうございました。>asahina1979さん
    おかしな回答してしまい大変失礼しました。>質問者さん他のみなさま

    みなさんには申し訳なかったのですが、おかげさまで自分は勉強させていただきました。スミマセン!

    キャンセル

  • 2017/11/17 16:33

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

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Java

    13133questions

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

  • IntelliJ IDEA

    122questions

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

  • JDBC

    88questions

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