首页 > 解决方案 > spring boot 在命令行上运行时不读取 application.properties 文件但在 STS 中工作

问题描述

我正在使用 STS 4 IDE 开发一个带有 Spring Boot 的桌面应用程序。在 STS 中一切正常,我有不同的属性文件用于不同的配置文件,主属性文件 application.properties 都在资源文件夹中

src/main/resources
application.properties
application-dev.properties
application-prod.properties

application.properties中,我定义了要扫描的环境和包,以查找两个应用程序数据库的实体:

spring.profiles.active=dev
wms.basepackage=com.wms
app.basepackage=es.app

我使用引导仪表板运行应用程序,一切正常。问题是在导出 JAR 时,我使用指令从命令中执行它

java -jar -Dspring.profiles.active=dev RunableApp4.jar

应用程序失败并出现以下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [es.app.InterfaceApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'wms.basepackage' in value "${wms.basepackage}"

我在日志中注意到从命令行运行应用程序的步骤与使用 STS 运行时的步骤不同:

STS 步骤(使用引导仪表板):

es.app.InterfaceApplication      Starting InterfaceApplication on matias-pc with PID 27945 (/home/matias/desarrollo/InterfaceApp/bin/main started by matias in /home/matias/desarrollo/InterfaceApp)
es.app.InterfaceApplication      The following profiles are active: dev
o.s.boot.SpringApplication                 Loading source class es.app.InterfaceApplication
o.s.b.c.c.ConfigFileApplicationListener    Activated activeProfiles dev
o.s.b.c.c.ConfigFileApplicationListener    Profiles already activated, '[dev]' will not be applied
o.s.b.c.c.ConfigFileApplicationListener    Loaded config file 'file:/home/matias/desarrollo/InterfaceApp/bin/main/application.properties' (classpath:/application.properties)
o.s.b.c.c.ConfigFileApplicationListener    Loaded config file 'file:/home/matias/desarrollo/InterfaceApp/bin/main/application-dev.properties' (classpath:/application-dev.properties) for profile dev
m.s.d.r.c.RepositoryConfigurationDelegate   Bootstrapping Spring Data JPA repositories in DEFAULT mode.
m.s.d.r.c.RepositoryConfigurationDelegate   Finished Spring Data repository scanning in 60ms. Found 13 JPA repository interfaces.
m.s.d.r.c.RepositoryConfigurationDelegate   Bootstrapping Spring Data JPA repositories in DEFAULT mode.
m.s.d.r.c.RepositoryConfigurationDelegate   Finished Spring Data repository scanning in 8ms. Found 4 JPA repository interfaces.

ConfigFileApplicationListener进入场景,加载主 application.properties文件application-dev.properties环境文件。然后RepositoryConfigurationDelegate正确加载存储库

命令行步骤:

java -jar -Dspring.profiles.active=dev RunableApp4.jar
13:07:49.453 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'spring.profiles.active' in PropertySource 'systemProperties' with value of type String
13:07:49.455 [main] DEBUG org.springframework.core.env.StandardEnvironment - Activating profiles [dev]
13:07:49.455 [main] DEBUG org.springframework.core.env.StandardEnvironment - Activating profiles [dev]
3:07:49.537 [main] INFO es.app.InterfaceApplication - Starting InterfaceApplication on matias-pc with PID 32173 (/home/matias/Documentos/JARS/RunableApp4.jar started by matias in /home/matias/Documentos/JARS)
13:07:49.537 [main] DEBUG es.app.InterfaceApplication - Running with Spring Boot, Spring
13:07:49.537 [main] INFO es.app.InterfaceApplication - The following profiles are active: dev
13:07:49.538 [main] DEBUG org.springframework.boot.SpringApplication - Loading source class es.app.InterfaceApplication
13:07:49.580 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7a1ebcd8
13:07:49.584 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
13:07:49.642 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: URL [jar:file:/home/matias/Documentos/JARS/RunableApp4.jar!/mx/gm3s/configuracion/ConfiguracionDSErp.class]
.
.
Read candidate components
13:07:49.861 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [es.app.InterfaceApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'wms.basepackage' in value "${wms.basepackage}"
13:07:49.864 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [es.app.InterfaceApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'wms.basepackage' in value "${wms.basepackage}"

ConfigFileApplicationListenerRepositorConfigurationDelegate没有到达现场,AnnotationConfigApplicationContext 开始扫描组件,由于无法解析属性值而失败。

我已经尝试将属性文件作为参数发送,但结果是一样的:

java -jar -Dspring.profiles.active=dev  -Dspring.config.location=file:/InterfaceApp/src/main/resources/application.properties RunableApp4.jar

主要课程有:

@SpringBootApplication
@Import(ConfigInterfaceApp.class)
@EnableScheduling
public class InterfaceApp  {

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


@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"${wms.basepackage}", "${app.basepackage}"})
public class ConfigInterfaceApp {

}

我究竟做错了什么?

标签: javaspringspring-bootspring-data-jpa

解决方案


阅读application.properties您的应用程序,如下所示:

ClassLoader.class.getResourceAsStream("/path/to/application.properties");

或者,

ClassLoader.getResourceAsStream("/application.properties");

推荐阅读