2016-10-05 4 views
0

私はSpring Boot/JPA/Hibernateを使用しています。私はHSQLDBを使って、サーバにデプロイするときにlocalhostとMySQLをテストしたいと思っています。 pom.xmlでSpring Boot/JPA/Hibernate、Springのプロファイルに従ってデータベースベンダーを切り替えるには?

、私は、MySQLのため、この依存関係を持っている:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
</dependency> 

とHSQLDBのため、この依存関係:

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
</dependency> 

私はおそらくにのpom.xmlに両方の依存関係を置くことができませんスプリングブート自動設定。しかし、local Springプロファイルがアクティブで、server Springプロファイルがアクティブな場合にMySQLを使用する場合、HSQLDBを使用したいと思います。理想的には、1つのwarファイルしか生成せず、mvn spring-boot:runでローカルバージョンを実行し、warファイルからサーバーバージョンを展開したいとします。

P.S:私はあなたがMavenのプロフィールない春のプロファイルを作成し、accordily依存関係を追加する必要があるのmaven

+0

をジャーに切り替えるにはもう一つの理由は?アプリケーションが正しく起動していませんか?それ以外の場合 – Patrick

+0

アプリケーションに2つの異なるデータソースを実装し、どのデータソースが使用されているかをプロファイル値で欺くことができます。 – Patrick

+0

@Patrickさらに調査したところ、問題はMySQLとHSQLDBの間のSQLの方言の非互換性から来ていることが分かりましたが、Stephane Nicollはpom.xmlに両方の依存関係を持つことに問題はありません。 –

答えて

3

おそらく、Springブートの自動設定のために、両方の依存関係をpom.xmlに入れることはできません。

確かに両方を持つことができます。いくつかの解決策があります。

最も基本的なのは、両方の依存関係を持ち、mysqlデータベースの設定でプロジェクトにapplication-server.propertiesを作成することです。特定のプロファイルを持たずにアプリケーションを実行すると、SpringブートはMySQLに接続する情報を見つけられないため、HSQLにフォールバックします。サーバーにアプリケーションをデプロイするときは、serverプロファイルを有効にしてください。両方のユースケースで同じアーティファクトを使用できます。

fat jarを生成するときにhsqlの依存関係を除外することで、その解決策を少し改善することができます。これは、プロファイルを有効にすることを忘れると、メモリ内のデータバを静かに使用するのではなく、起動時に例外が発生するという利点があります。 hsqlを除外するには、単純にconfigure the maven plugin。アプリケーションをローカルで実行する(mvn spring-boot:run)かIDE上で実行すると、fat jarにはmysqlの依存関係のみが含まれます。あなたはまだserverプロファイルを有効にする必要があります。

あなたは戦争を使用している場合は、その最後のソリューションを使用することはできません:両方の依存関係が設定されている場合、あなたは持っていない問題;-)

+0

なぜhsqlをwarファイルから除外できないのですか? ? –

+0

できます。しかし、warファイルを実行してそれを除外する必要がある場合は、インメモリデータベースを使ってアプリを実行することはできません。 jarファイルを持っている場合は、IDEから直接アプリを実行できます –

3

を使用しています。 プロファイルをhsqldb依存関係で作成し、devモードでアクティブにします。次に、サーバのプロファイルをmysqlの依存関係で作成し、サーバにデプロイするためのパッケージ化中にそれを有効にします。私は個人的にはdevのリリースを命名規則として好んでいますが(私の謙虚な意見です)その後、春のプロファイルローカルプロファイルで

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>xyz</version> 
    <configuration> 
     <profiles> 
     <profile>local</profile>.... 

とサーバプロファイルで

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>1.4.1.RELEASE</version> 
    <configuration> 
     <profiles> 
     <profile>server</profile>... 

Mavenのプロファイルをショートカットしており、このスイッチ

mvn spring-boot:run -P[local or server] 
で目的の設定を実行します

Introduction to Build Profiles

+0

これは良い解決策ですが、テスト用とプロード用の2つのwarファイルを作成する必要があります。 – Patrick

+1

@パトリックそれは私たちの会社のプロジェクトで使用されるソリューションです。制作プロファイルはJSとCSSのソースを縮小し、ページの読み込み時間を改善します。私たちは 'mvn clean package -Prelease'を使ってprod warファイルを作成します。ビルド毎に細分化しないことは、開発中の迷惑な待ち時間を節約します。 – coladict

+0

@patrickそれは依存します:testとprodは同じdb(だからmysql)を使用することをお勧めします。彼は2つの戦争を創出しなければならない:一つは開発のため、もう一つは解放のため(テストと生産のため)。これは私が命名規約を変更することを提案しています – Sammyrulez

関連する問題