2017-12-05 5 views
0

私は現在Mavenを使用することを学んでいます。私はMavenリポジトリの依存関係を使用してMavenプロジェクトを作成する方法を理解しました - そして今私は次の質問をしています:Maven:クライアントが使用するデータベースがわからない場合は、正しいJDBCドライバの依存関係を作成するにはどうすればいいですか?

データベースアクセスを使用するアプリケーションHibernate経由で、対応するデータベースドライバを表す依存関係を追加する必要があります。たとえばMySqlではmysql-connector-java、Oracleではojdbcなどです。

しかし、プログラムを別のマシン上で実行したいのですが、どのデータベースエンジンを使用しているのかわかりません。これを解決する一般的な方法は何ですか?すべての可能なドライバを依存関係としてインポートするだけですか?それとももっとエレガントな方法がありますか?

+0

すべての可能なドライバをバンドルすると、かなり無駄ではなく、ライセンスの問題も発生します。 – fvu

+0

ドライバを ''依存関係に設定すると、ランタイム環境が適切なドライバを決定(提供)することを意味します。問題は、ターゲット言語のタイプ(oracle、mysql、mssql、postgresqlなど)を決定する必要があることです。 。)これは、これを構成する異なるプロパティファイルを持つ必要があることを意味します。 – khmarbaise

+0

複数のデータベースをサポートする必要がある製品を構築することは、ORMを使用しても大変な作業です。私は経験から2つのシステムがPITAであることを知っています。あなたはどれくらいサポートしなければならないのですか?それぞれのドライバを含めることはできませんか? – MarioDS

答えて

0

HibernateのようなORM(Object Relational Mapping)を使用するのは、Hibernateによって解釈されてSQLクエリに変換されるJavaコードを記述するため、最適なソリューションです。

どの時点で、どのデータベースを使用するか決定しなければならない場合は、ドライバを追加する必要があります。

別の解決策は、Mavenを使って異なる環境のための設定を行うことができます。https://maven.apache.org/guides/mini/guide-building-for-different-environments.html

+0

これは彼がとにかく尋ねていることではありません。 –

0

問題がバウンド特に達人ではありません。新しいデータベースに移動するたびに、管理者はDBに従って正しいJDBCドライバを使用する必要があります。はい、別のjarファイルが必要です。

データベースのjarファイルをコードにバンドルしたくないということです。アプリケーションサーバーなどに既に存在している場合や、インストール中にパスを削除するように指定する場合があります。

ウェブアプリケーションを作成しているとします。 warファイルをmavenにバンドルすると、warファイル内のすべての依存関係が含まれます。したがって、コンパイルとテストで依存関係は存在するが、パッケージ内では存在しないように指定する必要があります。そうする方法は、これは、jarファイルは、ターゲットプラットフォーム上に存在します、したがって、任意のバンドルにパッケージ化してはならないことを意味

<dependency> 
    <groupId>some.db</groupId> 
    <artifactId>jdbc-driver<artifactId> 
    <scope>provided</scope> 
</dependency> 

提供され、それを指定することです。

私が前提にしているのは、本当に、これはウェブアプリですか?それとも、スタンドアロンですか?とにかく、それが助けて欲しい。

+1

明示的に実装クラスを使用するつもりでない限り、これは必須ではありません。その時点で、システムはもはやデータベースに依存しません。 – Kayaman

0

依存関係はまったく必要ありません。必要なのは、実行時にドライバを利用できるようにすることです。これを行う方法の1つが依存関係にあることは事実ですが、データベースが分からなければ、そこにすべてを束ねることはできません。最も一般的なドライバーを付けることができますが、ライセンスの問題があると言われています。

Webアプリケーションについて話している場合は、適切なドライバを入手し、ソフトウェアが使用するJNDIデータソースを設定するようにユーザーに指示することができます。これは当時の標準ですが、アプリケーションはWebアプリケーションであり、エンドユーザーは物事をどのように設定するかを知っています(彼がそうでない場合、おそらく彼はシステムを最初の場所)。

ローカルデータベースを使用するスタンドアロンプ​​ログラムでは、H2などのメモリ内データベースを使用し、他のデータベースを許可しないという簡単な選択肢があります。もちろん、このケースはすべてでは機能しませんが、例として含めています。いずれにしても、webappと同じように沸騰します。エンドユーザーに正しいドライバを入手させてください。データベースサーバーとアプリケーションを実行している場合、適切なドライバも見つかるはずです。次に、ランタイムクラスパスに含まれていることを確認するだけです。これは少し難しいかもしれません。

これはSquirrelSQLによって行われている方法は、以下の図のようにドライバを明示的に選択することです。これはもちろん、ユーザーが自分が何をしているのかを理解する必要があることを意味します。

enter image description here

0

私はあなたのすべてが自動的に起こるしたいとアプリの動作を持つようにシステムを設定する方法、各ユーザ/マシンの管理者に指示するにはあまりにも熱心じゃないことを前提としています。私はあなたが望むかもしれない方法では可能ではないと恐れています。

スタンドアロンデータベース解決策Kayamanは、あなたのケースでは最高の解決策であるかもしれませんが、それ以上のことを知らずに言うのは難しいかもしれません。

ただし、ここにはmavenを使用することに関するいくつかの側面があり、いくつかの注意事項では困難が考えられます。私は 休止を介して、例えば、データベース・アクセスを使用するアプリケーションがある場合

は、私は、例えばMySQLのコネクタからJava MySQL用、ojdbc用のために、 対応するデータベースドライバを表す依存関係を追加する必要がありますOracleなど。

はい。また、についてはDriverと関連しているかもしれません。依存関係を追加するだけでなく、いくつかのpropファイルまたはpersistence.xmlをフィルタリングすることもあります。それはmavenとそのプラグインの仕事かもしれません。しかしそれでも、それを処理するためには、それぞれの可能なdbの代替案とmavenのプロファイルに関する知識が必要です。

しかし、プログラムを別のマシンで実行したい場合は、 はどのデータベースを使用しているのかわかりません。これを解決する一般的な方法は何ですか? どのようなオプションがありますか?すべての可能なドライバを の依存関係としてインポートするだけですか?よりエレガントな方法がありますか?

すべてのプログラムには依存関係がある。それはDBに関係しているかどうか。ある意味では、他の回答が示唆しているように、これはmaven固有ではありません。 JDBCドライバのレベルで実際に開発したい場合は、あらゆる環境の要件を認識する必要があります。私は信じている - -

あなたのこの特定の問題が何かあるようなもの開発する動機です:

注1にも同様の命名ODBC & JDBCはまったく異なるレベルにあります(私は、実際には主要な問題であるかもしれないJDBCドライバがどのように見つかったのかを意味します...)

注2 JNDIは何が必要に応じて、大きな助けになり、最終的に行うことを決定することができますデータソース

しかしmavenに限定されるものではありません。しかし、ODBC/JNDIを使用することができれば、それほど大きな役割はありません。

関連する問題