web-dev-qa-db-ja.com

Spring Boot application.propertiesをTomcat / libフォルダーに外部化する方法

Tomcat/libフォルダーから構成ファイルを取得できる、構成不要のデプロイ可能なwar、myapp1.warが必要です。同じTomcat上に共存する他のWebアプリケーションmyapp2.war、myapp3.warがあるため、このレイアウトが必要です。

Tomcat/lib/myapp1/application.properties
Tomcat/lib/myapp2/application.properties
Tomcat/lib/myapp3/application.properties

このようにして、war内にプロパティファイルなしでwarファイルをビルドし、任意のサーバーにデプロイできます。

Spring documentation を読みましたが、jarとして実行するときに場所を設定する方法を説明しています。

Java -jar myapp.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

複数の共存するwarファイルの場合にこれを行う方法はわかりません。

これが可能かどうか、またはSpring Bootをあきらめて従来のSpring MVCアプリケーションに戻る必要があるかどうかを知りたいです。

23
Daniel Mora

解決策は、この question が示唆するように@PropertySourceアノテーションとしてapplication- {profile} .propertiesをロードすることですが、ロギングシステムは動作しません documentation =。

ロギングシステムはアプリケーションライフサイクルの初期に初期化されます。そのため、@ PropertySourceアノテーションを介してロードされたプロパティファイルにはロギングプロパティが見つかりません。

これは、application- {profiles} .propertiesのロギングプロパティが次のようになることを意味します。

logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log

無視され、ロギングシステムは機能しません。

これを解決するために、SpringApplicationBuilder.properties()メソッドを使用して、アプリケーションの構成時に最初にプロパティをロードしました。そこで、Spring Bootが使用する「spring.config.location」を設定して、すべてのapplication- {profiles} .propertiesをロードします。

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }
}

次に、プロパティファイルをsrc/main/resourcesからsrc/main/resources/myapp1に移動しました

.
├src
| └main
|   └resources
|     └myapp1
|       └application.properties
|       └application-development.properties
|       └logback.xml
└─pom.xml

Pom.xmlでは、組み込みTomcatライブラリのスコープを「提供済み」として設定する必要があります。また、src/main/resources/myapp1内のすべてのプロパティファイルを最終的な戦争から除外し、構成のないデプロイ可能な戦争を生成するには:

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <packagingExcludes>
              **/myapp1/
            </packagingExcludes>
        </configuration>
    </plugin>

次にTomcatで

├Apache-Tomcat-7.0.59
 └lib
   ├─myapp1
   |  └application.properties        
   |  └logback.xml
   └─myapp2
     └application.properties
     └logback.xml

これで、構成のないwarを生成して、Apache-Tomcat-7.0.59/webappsフォルダーにドロップできます。プロパティファイルは、webappごとに独立して、クラスパスを使用して解決されます。

   Apache-Tomcat-7.0.59/lib/myapp1
   Apache-Tomcat-7.0.59/lib/myapp2
   Apache-Tomcat-7.0.59/lib/myapp3
30
Daniel Mora

Linux 4.2のSpring 4.2および@Annotation構成とTomcat

Applicationクラスで、@ PropertySourceを次のように設定します。

@Configuration
@EnableWebMvc
@PropertySource(value = { "classpath:application-yourapp.properties"})
@ComponentScan(basePackages = "com.yourapp")
public class YourAppWebConfiguration extends WebMvcConfigurerAdapter {

    ...
}

クラスパスにプロパティファイルを含めるだけです

実稼働中

Tomcatに.warファイル(または何でも)をデプロイし、実稼働マシンにapplication-yourapp.propertiesを配置します。 (/opt/applyconfigfolder/application-yourapp.propertiesの例の場合)

次に、Tomcat(ここではTomcat 7)でbin\catalina.shを開きます

この行があります

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

Application.propertiesを含むフォルダーのパスを追加するだけです

CLASSPATH=:/opt/applyconfigfolder

すでにクラスパスを定義している場合は、追加できます

CLASSPATH=:/opt/applyconfigfolder:/yourpath1:/yourpath2:

私は窓を試していないが、問題はないと思う

開発中(Eclipseを使用)

├src
| └main
|   └ ....
└config
| └application-yourapp.properties

src/main/resources/application-yourapp.propertiesの代わりに

これで、Eclipseでconfigフォルダーをクラスパスに追加し、Tomcatサーバー(または同等の)の「実行構成」に移動して、ユーザーエントリにConfigフォルダーを追加します。

enter image description here

OK、それだけです。application.propertiesはアプリケーションの外にあり、プロジェクトは開発環境で完全に実行されます。

2
amdev

ダニエル・モラは良い解決策を与えましたが、spring.config.locationを使用する代わりにspring.config.nameを使用できます( https://docs.spring.io/spring-boot/docs/current/reference/html/ boot-features-external-config.html#boot-features-external-config-application-property-files )ので、同じTomcat/libディレクトリ内の異なるWebアプリに対して異なるプロパティファイルを持つことができます:

    public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }
    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.name", "myapp1");
      return props;
   }
}

Libディレクトリは、Webアプリの構成プロパティを保存するためではなく、サードパーティのライブラリ用であると思います。したがって、conf/catalina.propertiesのshared.loaderプロパティを使用して、外部フォルダーを追加のクラスパスフォルダーとして追加することをお勧めします。

shared.loader = $ {catalina.base}/shared/configurations

アプリケーションプロパティapp1.properties、app2.properties、ecc ..をApache-Tomcat-7.0.59/shared/configurationsに配置できます。

SpringBootServletInitializerのconfigureメソッドをオーバーライドするDaniel Moraソリューションを見つける前に、私のソリューションはsrc/main/webapp/META-INFにこのコンテンツでcontext.xmlを追加することでした。

<Context>
    <Environment name="spring.config.name" value="myapp1" type="Java.lang.String" override="false" description="define the property file for srping boot application"/>
</Context>
2