2009-08-26 27 views
2

私は現在、MS SQL Server 2000データベースに接続しているが、すぐにMS SQL Server 2005データベースに接続する小さなJavaプロジェクトに取り組んでいます。私は展開を簡単にするために単一のjarファイルを作成しています。私はそれを設定しようとしていたので、設定ファイルを変更してドライバを変更するだけでした(.NETのように)。ただし、JavaのJar embedded classpathの制限、および埋め込みクラスパス(1)のワイルドカード文字の欠如のために。すべてのドライバjarを明示的に参照せずにこの問題を回避する方法はありますか? これを行う必要がある場合は、データベースが変更されるたびに再コンパイルする必要があります。Java 1.4のJarファイルの依存関係

(1)ただし、クラスパスのワイルドカードはクラスパスのjar-manifestヘッダーには適用されません。

+0

あなたのリンクはJava 6です。1.4では、クラスパスのワイルドカードはまったくありませんでした。 – Yishai

+0

私は知っている、さらに良い! –

答えて

2

通常、classpath at runtimeを変更することができます。このようなアプローチは、Javaの「プラグイン」タイプのjarファイルを扱う一般的な方法です(あなたの場合と非常に似た要件です)。

0

使用するドライバに関する情報を含めることができます。設定ファイルまたは、JARファイル自体のマニフェストにあります。アプリケーションの起動時にすべてのJARファイルをインクルードしますが、設定からドライバの名前をロードしてください。

0

私は、あなたが配備しているのと同じJarファイルにサードパーティのコードを組み込むのはJavaの方法ではないと言います。しかし、jarファイルは単なるzipファイルなので、ほとんどの場合(マニフェストの中にある素晴らしいものを除いて)、必要に応じてそれらを組み合わせることができます。

これは、潜在的なすべてのJDBCドライバjarへのクラスパス参照をjarファイルに含めることができます。または単にJDBCドライバjarを正しい方法で呼び出すことができます。次に、同じディレクトリに構成ファイルを置いて(JARのクラスパスに。を必ず含めてください)、そこからドライバ名を読み、Class.forName()を使ってドライバを読み込みます。

ランタイムに正しいjarファイルを見つけて、クラスパス上になくても動的に読み込むような気がしますが、これらは少し複雑ですので、上記のような簡単な作業が必要です。

再コンパイルする必要はありません。ドライバを変更したときに再コンパイルする必要がある場合は、実際にJDBCを正しく実行していません。

+0

ClassPathにないJar内のクラスでClass.ForName()を実行できますか?そうでなければ、クラスパスに特別に列挙されているJarファイルに限定されていますが、新しいドライバjarが出てきたら、まだ再コンパイルする必要があります(re-jar?)。 –

+0

Class.forNameはクラスパス実行時に存在する必要があります。再コンパイルする必要はありません。新しいjarが出てきたら、ファイルを置き換えるだけで、再コンパイルする必要はありません。 – Yishai

+0

マイクロソフトでは、ドライバのjarファイルに異なる名前を付けるという素晴らしい習慣があります。 –

0

ドライバjarファイルと特定のプロバイダのJDBCドライバの実際の名前を分離する必要があります。

jdbcドライバjarを自分のjarファイルに含めないことをお勧めします。 実行時にパスに移動します。 同様に、実行時にシステムプロパティからJDBCドライバマネージャの名前を取得することも、設定ファイルを取得することもできます。

java -jar myapp.jar -cp sqlserver.jar -DdriverManager=com.microsoft.sqlserver.jdbc.SQLServerDriver -DdbUrl=jdbc:some:url 

やアプリケーションで、この(私は例外処理を省略)ような何か:だから、このようなアプリを実行している

Class.forName(System.getProperty("driverManager")); 
Connection conn = DriverManager.getConnection(System.getProperty("dbUrl")) 

を。

この方法では、クラスパスに適切なjarファイルを追加し、driverManagerおよびdbUrlプロパティを変更するだけでドライバを変更できます。この方法では、新しいドライバをサポートするために再コンパイルする必要はありません。

これは私が考えることができる最も簡単な解決策です。

+0

ClassPathにないJar内のクラスでClass.ForName()を実行できますか?そうでなければ、クラスパスに特別に列挙されているJarファイルに限定されていますが、新しいドライバjarが出てきたら、まだ再コンパイルする必要があります(re-jar?)。 –

+0

Class.forName()では、文字列を指定するので、必要なものを置くことができ、例外が検出されて何かが見つかったかどうかを確認できます。 BUT。なぜあなたはClass.forName()をハードコーディングしたいのですか?上記の解決方法では、実行時に変更することができます。これにより、正しいdriverManagerとdb urlが提供されている(データベースドライバを持つjarがクラスパスにある)限り、アプリケーションはデータベースをサポートできます。 –

関連する問題