Spring引导jar无法读取/解析application.properties根文件夹

时间:2018-05-01 13:11:30

标签: java spring-boot configuration application.properties

场合

我有一个胖的.jar的Spring启动应用程序。我用application.properties文件外化了我的配置。此文件与.jar位于同一文件夹中,我从同一文件夹中的命令行启动.jar(使用命令“java -jar $ jarFileName”)。

然后抛出异常:

nested exception is org.springframework.beans.TypeMismatchException: 
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is 
java.lang.NumberFormatException: For input string: "${elasticsearch.port}"

正如您所看到的,它不是从属性文件中读取值,而是将字符串设置为@Value注释中的文本,如下所示:

@Value("${elasticsearch.port}")
private int elkPort;

发生这种情况的类用@Component注释。 根据{{​​3}},spring应该读取jar之外的application.properties文件。

application.properties中放置相同的src/main/resources文件时,它可以正常工作,因此配置文件似乎是正确的。

为什么它不会加载外部配置文件的任何想法?

编辑1 我也尝试使用--spring.config.location=file:application.properties--spring.config.location=file:/full/path/to/application.properties运行它,但结果与上面相同。

编辑2:类路径尝试 还尝试了classpath而不是file,与上面的命令相同,但file替换为classpath。 最后没试过,所以只是--spring.config.location=/path/to/file;再次使用application.properties的相对路径和完整路径。所有尝试都给出了相同的结果/异常。

编辑3 我的注释申请:

@SpringBootApplication
public class ApplicationName {

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

编辑4 尝试添加PropertySourcesPlaceholderConfigurer如下:

@Configuration
public class PropertyConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

然后对于每个@Value我添加了一个默认值;它仍然只能解析为默认值而不是application.properties值。

3 个答案:

答案 0 :(得分:0)

如上所述,您应该指定外部配置位置

    $ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

尝试不使用file关键字         --spring.config.location = /全/路径/ application.properties

答案 1 :(得分:0)

我刚从Eclipse Spring Boot项目中取出了我的application.properties,但它失败了。 然后我将文件放在项目根目录下的cfg文件夹中,并添加了程序参数:

--spring.config.location=cfg/application.properties

它再次起作用。 Mayby如果你尝试一个相对路径(没有前导/)到文件(没有"文件:")它将工作。

答案 2 :(得分:0)

在经过一番挣扎之后,我找到了解决办法。我和PropertySourcesPlaceholderConfigurer很接近,但还没到那里;现在这是全班:

@Configuration
public class PropertyConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        final PropertySourcesPlaceholderConfigurer ppc = new PropertySourcesPlaceholderConfigurer();

        ppc.setIgnoreResourceNotFound(true);

        final List<Resource> resources = new ArrayList<>();

        resources.add(new FileSystemResource("relative/path/to/application.properties"));

        ppc.setLocations(resources.toArray(new Resource[]{}));

        return ppc;
    }
}

修改

为了演示此问题,我创建了一个存储库来显示问题,请参阅此处:https://github.com/Locitao/test-external-properties