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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
pom.xmlの設定を
https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.htmlを参考にしてください。
投稿2017/11/16 23:54
退会済みユーザー
総合スコア0
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総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 23:31
退会済みユーザー
2017/11/16 23:43 編集
2017/11/16 23:52
退会済みユーザー
2017/11/17 01:46 編集
2017/11/17 00:43
2017/11/17 00:56
2017/11/17 07:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/17 07:54 編集