質問: IntelijでMavenを使用してJDBC(Mysql)を含めてbuildしたいです。 そこでmaven shade pluginを使用し、依存関係に書いてあるmysql:mysql-connector-javaをincludeしました。(versionは5.1.44) しかしbuildをし、実行してみたところcom.mysql.jdbc.Driverが見つからないと表示され、buildしたものを解凍してみたところ.porject以外のソースは含まれていませんでした。 解決方法を教えてください。
回答: 訂正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のロードに失敗していること自体 を参照しますと,接続に必要な配慮について記載されてますが、(DBMS非依存の接続方法である)java.sql.DriverManagerを用いるか、またはクラスローダーに明示的にドライバークラスを指定する点とCLASSPATHにドライバーのjarのパスを含めることなどが記述されています。本件ではcom.mysql.jdbc.Driverが見つからないというエラーとのことなので上記いずれの方法にせよ(ドライバークラスは適切に設定されているようですので)CLASSPATHにJDBCドライバーが設定されていないことが原因であると思います。 (2) 本アプリケーションがmysqlに依存したものとして開発したい(mysql JDBC ドライバーを再配布することでの利用者の利便性もかねて)という場合のJARへ同梱するための方法。(元の回答はその想定の下での同梱方法になります)同梱するとCLASSPASSの問題はおこらないと思います。 取り急ぎ訂正まで。