Spring引导如何读取jar

时间:2017-01-20 01:07:59

标签: spring spring-boot properties configuration

在我的目标文件夹中,有2个文件夹,lib和conf。所有属性文件都放在conf文件夹中,而jar放在lib foulder中。

在spring boot之前,我们在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();
    }
}

6 个答案:

答案 0 :(得分:28)

我对问题的标题和描述感到有点困惑。希望我不会对你的评论更加困惑。

一般来说,Spring Boot对于项目结构以及创建的二进制文件都非常了解。推荐的方式(Spring Boot意见)是构建一个包含所有依赖关系的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

答案 1 :(得分:10)

我不确定你是否处理与我相同的情况,但在我的情况下,我有一个jar和一个* .properties文件。我所做的是让* .properties文件位于jar外面是下一个:

@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对象。

我希望这些评论有所帮助。

答案 2 :(得分:8)

Spring Boot docs中所述,

  

SpringApplication将从application.properties加载属性   将文件放在以下位置并将它们添加到Spring中   环境:

     
      
  1. 当前目录的A / config子目录。
  2.   
  3. 当前目录
  4.   
  5. classpath / config包
  6.   
  7. classpath root
  8.         

    列表按优先顺序排列(在位置中定义的属性)   列表中的较高值会覆盖较低位置中定义的值。

一种方法是简单地重命名你的“conf”。目录到&#39; config&#39;它会毫无问题地工作。因此,除非您希望将属性文件放在上述4之外的某个位置,否则无需进行额外配置。

在这种情况下,您可以明确定义属性源。

@PropertySource("classpath:config.properties")

和多个属性文件

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

答案 3 :(得分:3)

找到解决方案:

首先创建一个类并添加@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文件夹中读取配置文件

答案 4 :(得分:2)

找到另一种解决方案。

将每个配置放在一个application.properties文件中,并在代码中使用@Value(“$ {name}”)来读取。

并使用程序集文件将资源文件夹的文件复制到目标配置文件夹中。

在部署之后,只需要在config文件夹中更改application.properties文件并运行应用程序。

这是因为spring boot按顺序读取application.properties文件。

•位于当前目录中的/ config子目录

•当前目录

•classpath / config包

•类路径根

但这适用于一个属性文件。不适用于多属性文件

答案 5 :(得分:1)

实际上,最简单的方法是将application.propertiesyour.jar放在同一目录中,仅java -jar your.jar就会自动加载此外部配置文件。

如果您尝试通过ClassPathResource从资源文件夹中加载某些上下文/文件,则在读取文件时请勿使用pathResource.getFile(),而应使用pathResource.getInputStream(),{{1 }}在您的IDE中运作良好,但不适用于独立的getFile()