web-dev-qa-db-ja.com

Spring Boot jar外のプロパティファイルの読み取り方法

ターゲットフォルダーには、libとconfの2つのフォルダーがあります。すべてのプロパティファイルはconfフォルダーに配置され、jarはlibフォルダーに配置されます。

スプリングブートの前に、spring.xmlで次の構成を使用して@valueを使用します。

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

およびJavaのようなコード:

@Value("${name}")

private String name;

しかし、春のブートでは、Javaコードで同じことをする方法がわかりません。

フォローしようとしましたが、うまくいきません

@Configuration
@PropertySource(value = "classpath:aaa.properties")
public class AppConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
    }
}
16
Benjamin Liu

質問のタイトルと説明に少し混乱しています。うまくいけば、私のコメントであなたをさらに混乱させないことを願っています。

一般的に、Spring Bootは、作成されたバイナリだけでなくプロジェクト構造についても非常に批判されています。推奨される方法(Spring Bootの意見)は、すべての依存関係を含むjar(ファットjar)を構築することです。ファットjarの外部で構成プロパティを定義する必要がある場合(またはビルドした場合はwar)、Spring Bootには多くのオプションがあります(参照1を参照)。システムプロパティで設定できるフラグ(spring.config.location)を使用して、アプリが外部ファイルを指すようにします。

Java -jar -Dspring.config.location=<path-to-file> myBootProject.jar

環境変数を使用して外部ファイルの場所を定義することで、同様のことができることに注意してください。

これがお役に立てば幸いです!

参照:1. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

31
Alberto

あなたが私と同じ状況を扱っているかどうかはわかりませんが、私の場合は、jarと* .propertiesファイルがその外にあります。 jarの外部にある* .propertiesファイルを取得するために私がしたことは次のとおりです。

@Configuration
public class ApplicationContext {

  @Bean
  public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("application.properties"));
    properties.setIgnoreResourceNotFound(false);

    return properties;
  }
}

Application.propertiesファイルの場所を設定するときに、FileSystemResourceオブジェクトを作成しました。これにより、jarの隣にあるproperties.filesを取得できます。たとえば、。propertiesファイルがクラスパスにある場合、他のクラス(ClassPathResourceなど)を使用できます。Springが提供する他のクラスを読み取り、パッケージorg.springframework.core.ioの下でResourceオブジェクトを取得できます。

このコメントがお役に立てば幸いです。

Spring Boot docs で述べたように、

SpringApplicationは、次の場所にあるapplication.propertiesファイルからプロパティをロードし、それらをSpring環境に追加します。

  1. 現在のディレクトリの/ configサブディレクトリ。
  2. 現在のディレクトリ
  3. クラスパス/ configパッケージ
  4. クラスパスのルート

リストは優先順に並べられます(リストの上位の場所で定義されたプロパティは、下位の場所で定義されたプロパティをオーバーライドします)。

1つの方法は、「c​​onf」ディレクトリの名前を「config」に変更するだけで、問題なく機能します。したがって、プロパティファイルを上記の4つ以外の場所に配置するまで、追加の設定を行う必要はありません。

その場合、プロパティソースを明示的に定義できます。

@PropertySource("classpath:config.properties")

および複数のプロパティファイル用

@PropertySources({
    @PropertySource("classpath:config.properties"),
    @PropertySource("classpath:logging.properties"),
    @PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true)
})
8
jayantS

ソリューションを見つけました:

最初にクラスを作成し、@ ConfigurationPropertiesを追加します

@ConfigurationProperties(prefix = "asdf", locations = "file:conf/aaa.properties")
public class ASDF {
    private String name;   

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

場所に注意してください、クラスパスではなくファイルを使用します。

次に、アプリケーションクラスで、@ EnableConfigurationPropertiesを追加します

@SpringBootApplication
@EnableConfigurationProperties({ASDF.class, BBB.class})
public class InitialBeanTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(InitialBeanTestApplication.class, args);
    }
}

confフォルダー内の構成ファイルを読み取ることができます

3
Benjamin Liu

別のソリューションが見つかりました。

すべての構成を1つのapplication.propertiesファイルに配置し、コードで@Value( "$ {name}")を使用して読み取ります。

アセンブリファイルを使用して、リソースフォルダーのファイルをターゲット構成フォルダーにコピーします。

デプロイ後、configフォルダーのapplication.propertiesファイルを変更して、アプリケーションを実行するだけです。

これは、スプリングブートがapplication.propertiesファイルを次の順序で読み取るためです。

•現在のディレクトリにある/ configサブディレクトリ

•現在のディレクトリ

•クラスパス/ configパッケージ

•クラスパスルート

ただし、これは1つのプロパティファイルに対して機能します。乗算プロパティファイルではありません

2
Benjamin Liu

実際、最も簡単な方法は、application.propertiesyour.jarを同じディレクトリに配置することです。Java -jar your.jarだけがこの外部設定ファイルを自動的にロードします。

ClassPathResourceを介してリソースフォルダーからコンテキスト/ファイルをロードしようとしている場合、ファイルを読み取るときにpathResource.getFile()を使用せず、代わりにpathResource.getInputStream()getFile()はIDE内で適切に機能しますが、スタンドアロンのjarでは機能しません。

1
Neeson.Z