4

Microsoft SQL Serverデータベースからデータを取得し、それをMySQLデータベースにプッシュするプロジェクトをclojureでビルドしようとしています。

プロジェクトはleinrunを使用して正常に実行されますが、leiningenを使用してuberjarにパッケージ化し、java -jarを使用して実行すると、次のように失敗します。

スレッド「main」の例外java.sql.SQLException:jdbc:sqlserver...に適したドライバーが見つかりません。

このエラーは、MySQLデータベースとSQLServerデータベースの両方を使用しようとした場合にのみ発生します。それらのいずれかを単独で使用する場合、jarファイルはjava-jarを使用して正常に実行されます。

私のproject.cljは次のとおりです。

(defproject sqlserver-clojure "1.0.0-SNAPSHOT"
  :description "A minimal example of the MySQL/SQLServer conflict"
  :dependencies [[org.clojure/clojure "1.4.0"]
             [com.microsoft/sqljdbc4 "3.0"]
             [clojureql "1.0.4"]
             [mysql/mysql-connector-java "5.1.6"]]
  :main sqlserverclojure.core)
4

2 に答える 2

4

問題は、uber-jarを作成するときに.properties、ドライバーに必要な一部のファイル(XML構成など)をコピーしていないか、両方のJDBCドライバーに存在するファイルを上書きしている可能性があります。

上書きの良い例は、META-INF/services/java.sql.DriverすべてのJDBC4ドライバーが持つファイルです。このファイルには、を実装するjar内のすべてのクラスのリストが含まれているjava.sql.Driverため、java.sqlDriverManagerクラスはを使用してすべてのドライバー実装を自動的にロードできますServiceLoader

複数のJDBCドライバーを使用してuber-jarを作成する場合は、このファイルにこれらすべてのファイルの和集合が含まれていることを確認するか、アプリケーションが必要Class.forName("<name of the java.sql.Driver implementation>")なドライバーごとに必要なドライバーを明示的にロードし、JDBCに依存しないようにする必要があります。 4ドライバーの自動読み込み。

また、uber-jarの作成に使用するプロセスが、ファイルだけでなくすべてのリソースをコピーすることを確認してください。.class

さらに良いことに(私の意見では)、uber-jarを使用しないでください。ただし、依存.jarファイルを外部に保持し、アプリケーションClass-Pathのファイルのエントリでそれらを参照してMETA-INF/MANIFEST.MFください。これにより、uber-jarを機能させるための手間が大幅に軽減されます。正しく(または実際に正しく機能していることを確認してください)。

于 2013-02-20T11:37:05.960 に答える