如何使用application.properties文件上的动态端点打包springboot应用程序

时间:2018-11-14 09:43:38

标签: spring spring-boot

我有1个Spring Boot应用程序。在此应用程序中,我已将1个电子商务系统配置为弹性路径(在application.properties文件中配置弹性路径的终点网址)。现在,我必须将我的spring boot应用程序交给其他一些人。它将部署在tomcat服务器上。我不想提供源代码。因此,我可以制作战争文件,但现在的问题是,他们拥有自己的弹性路径电子商务,并且他们希望配置自己的电子商务。

我想外部化一些将覆盖现有属性的属性。

我的springboot应用程序具有2个模块: 1)具有elasticpath-application.properties的elasticpath模块 2)salesforce-salesforce-application.properties

现在,我必须外部化“ C:\ apache-tomcat-8.5.29 \ conf \ ep-external.properties”文件,该文件将覆盖现有属性。现在的问题是@PropertySource正在加载到最后一个位置。因此我的外部文件无法覆盖该属性。

@SpringBootApplication
@PropertySource(value = {"classpath:application.properties", "classpath:elasticpath-application.properties", "classpath:salesforce-application.properties")
public class SpringBootDemo extends SpringBootServletInitializer implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(SpringBootDemo.class);
    private ServletContext servletContext;

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        //application = application.properties("file:C:\\apache-tomcat-8.5.29\\conf\\ep-external.properties");
        return application.sources(SpringBootDemo.class);
    }

    @Override
       public void onStartup(ServletContext servletContext) throws ServletException {
           this.servletContext = servletContext;
           super.onStartup(servletContext);
       }

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

    @Override
    public void run(String... args) throws Exception {
    }

}

1 个答案:

答案 0 :(得分:1)

是的,绝对有可能。基本上,您需要按需更改属性值,而无需更改jar / war

为jar传递命令行参数
将您的spring boot应用程序打包为jar,并将外部application.properties文件放在任何位置,并与命令行参数传递相同的位置,如下所示:

 java -jar app.jar --spring.config.location=file:<property_file_location>

这将获取外部属性。

传递用于战争的命令行/动态参数
1.如下扩展SpringBootServletInitializer

@SpringBootApplication
class DemoApp extends SpringBootServletInitializer {
    private ServletContext servletContext;
    public static void main(String[] args){SpringApplication.run(DemoApp.class,args);}
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder = builder.properties("test.property:${test_property:defaultValue}");
        return builder.sources(DemoApp.class)
   }
   @Override
   public void onStartup(ServletContext servletContext) throws ServletException {
       this.servletContext = servletContext;
       super.onStartup(servletContext);
   }
}
  1. 像往常一样在任意位置访问属性,如下所示:

    @Value(“ $ {test.property}”)

  2. 在启动tomcat之前,请设置名为 test_property 的环境变量。就是这样

另外:

如果您想提供完整的文件作为外部文件,也可以传递如下所示的属性。

.properties("spring.config.location:${config:null}")

有关外部化配置的更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html