spring - 如何使用外部路径作为命令行参数或配置文件夹在 Spring Boot 2.1.7 中读取外部 xml

标签 spring spring-boot spring-mvc

正在开发具有外部配置的 Spring Boot 应用程序。使用以下命令通过命令提示符运行 Jar 文件。

java -jar Service-1.0.jar --spring.config.additional-location=C:/Users/Administrator/Desktop/Springboot/

需要通过命令行参数传递外部配置路径,因为它们可能会有所不同。

主类

@ImportResource(locations = {
        "config/spring/service-config.xml",
        "config/spring/datasource-config.xml"

})
public class ServiceMain {

    public static void main(String[] args) {

        ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(ServiceMain.class)
                .build()
                .run(args);
        for (String name : applicationContext.getBeanDefinitionNames()) {

        }

    }
}

当我运行这个 jar 时,它显示以下错误

enter image description here

编辑 1 更改运行命令

java -jar Service-1.0.jar --spring.config.additional-location=C:/Users/Administrator/Desktop/Springboot/,--external.config=C:/Users/Administrator/Desktop/Springboot/

改变了主类

 @ImportResource(locations = {
            "${external.config}/config/spring/service-config.xml",
            "${external.config}/config/spring/datasource-config.xml"

    })
    public class ServiceMain {

        public static void main(String[] args) {

            ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(ServiceMain.class)
                    .build()
                    .run(args);
            for (String name : applicationContext.getBeanDefinitionNames()) {

            }

        }
    }

显示异常

java.lang.IllegalArgumentException: Could not resolve placeholder 'external.config' in value "${external.config}/config/spring/service-config.xml"
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at com.ge.hcit.xer.app.services.api.XERServiceMain.main(XERServiceMain.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'external.config' in value "${external.config}/config/spring/service-config.xml"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237)
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211)
    at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:575)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:311)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
    ... 18 common frames omitted

导入资源如何获取外部配置

编辑2

正在将配置放在配置文件夹中。外部 application.properties 正在当前项目中加载,但未在依赖项项目中加载。

@Configuration
public class ConfigurationFactory
{

    public static final String REQ_CONF = "config/Configuration.xml";
    public static final String FILTER_XML_CONF = "config/DocFilter.xml";
}

spring 仅加载外部 application.properties/yml 文件吗?

最佳答案

使用系统资源文件的file:前缀:

@ImportResource(locations = {
     "file:${external.config.location}/config/spring/service-config.xml",
     "file:${external.config.location}/config/spring/datasource-config.xml"
})

使用--external.config.location=xxx运行:

java -jar Service-1.0.jar --external.config.location=C:/Users/Administrator/Desktop/Springboot

关于spring - 如何使用外部路径作为命令行参数或配置文件夹在 Spring Boot 2.1.7 中读取外部 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623361/

相关文章:

java - 无法使用 JpaTransactionManager 在 Spring 测试中保留实体

javascript - 使用onclick事件更改对象html标签的数据

java - Spring Boot 升级时找不到 log4j 文件问题

java - 自移动到 Spring Boot 1.1.4.RELEASE 以来,@Value 和 application.properties 出现问题

spring boot和批处理抛出无效的对象名称 'BATCH_JOB_INSTANCE'

java - Spring 的带注释的 IOC 对于 Guice 人来说是令人困惑的。帮助启发我

java - 通过 Maven 在 Spring Boot 中配置 Activity 配置文件

java - thymeleaf 中 String 对象的 #strings.replace() 实用方法是否替换了提供的字符串中的所有匹配项?

java - 启动 Spring MVC 应用程序时获取 BeanDefinitionStoreException

javascript - 我如何传递两个参数 @Path 和 @PathParam