2017-06-23 14 views
6

共通の構成を定義しているapplication.propertiesのコモンズライブラリを作成した場合以下のように:私はそれらコモンズライブラリが含まれ、別のプロジェクトにこれらのプロパティを継承するにはどうすればよいSpringでapplication.propertiesを継承する方法は?

spring.main.banner-mode=off

のMaven:

<project ...> 
    <groupId>de.mydomain</groupId> 
    <artifactId>my-core</artifactId> 
    <version>1.0.0</version> 

    <dependencies> 
     <dependency> 
      <!-- this one holds the common application.properties --> 
      <groupId>my.domain</groupId> 
      <artifactId>my-commons</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
    </dependencies> 
</project> 

どのように私はmy-coremy-commonsから設定を継承することができますか?

+1

実際にプロパティを継承する必要はありません。 IMO、それは危険です。それについて考えると、2つの異なる依存関係から同じプロパティを継承するとどうなりますか?これらの競合をどのように検出できますか? –

+0

さて、私のプロジェクトのすべてに適用する設定を追加するにはどうすればいいですか?例えば、 'Logger'を使う、共通の' MailSender'、XML設定などを設定する、全社的なコモンズプロジェクトを定義したいとしましょう。それを継承する各プロジェクトは、この設定を強制的に使用する必要があります... 'spring -boot'自体が何らかの形でそれを管理して、デフォルトのプロパティを定義します。そしてそれらは無効にすることさえできる。しかし、彼らはどのようにこれを達成していますか? – membersound

+0

@ membersoundあなたは答えを持っていますか? – soorapadman

答えて

2

ソリューションは、共有ライブラリでは、ここでapplication-shared.properties

、別の名前を使用して、共有のプロパティを含めることです

@SpringBootApplication 
@Import(SharedAutoConfiguration.class) 
public class MainAppConfiguration extends SpringBootServletInitializer { 

} 

コモンズ/共有この方法configはロードされますが、メインアプリケーションのapplication.propertiesでオーバーライドすることはできますが、

spring.main.banner-modeプロパティでは機能しません(理由はわかりません)が、他のすべてのプロパティではうまくいきました。

+1

これは、.ymlファイルではなく、.propertiesファイルに対してのみ機能することに注意してください。 https://stackoverflow.com/a/41984422/2187042 –

0

あなたがそれらを継承していることを前提としています(「継承された」とは、「my-core」のクラスでプロパティを使用できるようにすることを前提としています)。

「私-コモンズ」JARはsrc/main/resources/application.propertiesが含まれている場合、それはあなたが春でこれを試すことができますmy-core/src/main/resources

+1

Okですが、 'my-core'自体には' application.properties'も含まれています。このプロジェクト固有の設定があります。だからこれはおそらく継承されたプロパティを置き換えるでしょうか?だから、私はそれらを使うことができませんでした。 – membersound

+0

Ok。だから、この文脈では "継承"は "共有"ほど単純ではありません。 my-coreもapplication.propertiesを持っていて、src/main/resourcesにこれらのファイルが両方とも(クラスパスの点で)ある場合は、どちらがロードされるのかわからないので問題あります。多分私が紛失している文脈があるかもしれませんが、私のコモンズの目的が特定のタイプのプロパティを保存することであれば、その意図の名前のファイルに格納することができます。面。 – glytching

+0

ちょうどより明白になるために。 Springブートに複数のファイルからプロパティをロードするよう指示することができます。 '-Dspring.config.location = classpath:application.properties、classpath:common-application.properties' – glytching

0

に位置していたかのように、あなたのapplication.propertiesは、同じように「私の心」で利用できるようになります。

src/main/resources/application.propertiesは、あなたが言及したのと同じモジュールに定義することができます。それはそれに依存する他のプロジェクトのクラスパスに存在します。

その後注釈@PropertySourceと、共通モジュールに依存して他のプロジェクトで:

@Configuration 
@PropertySource("classpath*:META-INF/spring/properties/*.properties") 
public class Config { 
    ... 
} 

またはXML構成で:

<context:property-placeholder location="classpath*:META-INF/spring/properties/*.properties"/> 

それは所与のクラスパスディレクトリ内のすべての設定ファイルをインポートする必要があります。

また、クラスパスに2つの同じファイルを持つことはできません。あなたは葛藤します。例えば

、この状況は競合生成する:

プロジェクトA(プロジェクトBに依存):

  • src/main/resources/application.properties

プロジェクトB:

  • src/main/resources/application.properties

あなたはapplication.propertiesファイルの名前を変更するか、別のディレクトリに置く必要があります。

@SpringBootApplication 
@PropertySource(ResourceUtils.CLASSPATH_URL_PREFIX + "application-shared.properties") //can be overridden by application.properties 
public class SharedAutoConfiguration { 
} 

メインアプリで:

+0

あなたのソリューションはこのケースで動作します。プロパティがリソースファイルにある場合、 'classpath *:spring/application.properties'と言うだけです。 – soorapadman

+0

次のようにしてみました:' @PropertySource( "classpath:application-commons.properties")私のコモンズプロジェクトでは。しかし、それは動作しません。スプリングバナーはまだ印刷されています(つまり、プロパティがロードされていないことを意味します)。 – membersound

関連する問題