spring - 网络逻辑 12c : How to pass the "active profile" to a Spring Boot application?

标签 spring spring-boot weblogic weblogic12c

我正在开发一个 Spring Boot 应用程序,我必须让它在我们的 Weblogic 12c 中运行服务器,作为 war 。

我尝试找到一种方法将默认的 Spring 事件配置文件(信息 herehere)传递给应用程序,而无需在机器本身上设置环境变量。如果可能,我希望能够使用 Weblogic 管理控制台指定此配置文件。

我尝试使用“Environment / Servers / MyServer / Server Start / Arguments”选项,但我一直无法让 Spring 以这种方式加载指定的配置文件。我试过了,没有成功:

spring.profiles.active=dev
-Dspring.profiles.active='dev'
-Dspring.profiles.active=dev
-spring.profiles.active=dev
--spring.profiles.active=dev

知道是否可以通过 spring.profiles.active到 Spring,使用 Weblogic?我需要通过“dev”、“acc”或“prod”。

更新:我会接受一个解释任何简单方法的答案 .properties用于应用程序配置的文件,具体取决于运行 Sprint Boot 应用程序的环境。那些.properties文件可以捆绑在应用程序本身中,也可以是外部的。但是我需要至少尽可能地接触 Weblogic 正在运行的系统......没有环境变量,理想情况下也没有对 Weblogic 文件进行更改!理想情况下,该解决方案将涉及使用 Weblogic 管理控制台完成的某种操作,例如将表示当前环境的参数传递给 Spring Boot 应用程序以便正确的 application.[ENVIRONMENT].properties 的方法。文件被使用。

更新 2 :允许每个环境拥有自己的一种方式 application.properties文件,使用 Deployment plans .这可能是推荐的方法。我将添加它作为答案,但我仍然更喜欢更简单的方法......我无法相信在 Weblogic 中部署应用程序时,不可能简单地将参数传递给应用程序!如果不能用于此目的,“Environment / Servers / MyServer / Server Start / Arguments 选项是什么?

更新 3 :Related thread .如果我理解正确,“Environment / Servers / MyServer / Server Start / Arguments ”选项可能仅在启用 NodeManager 时才有效?这将解释为什么我无法通过 spring.profiles.active=dev多变的!

最佳答案

尽管 Spring Profiles 允许我们使用属于名为 profile 的同一逻辑组的一组属性填充 Spring Environment,但 Spring Profiles 不是目标,而是实现目标的方法之一。

目标是能够从外部化的配置中填充 Spring Environment,即目标是能够在不同的环境中部署相同的应用程序代码,并为每个单独的环境加载特定的配置。

Spring Boot 提供了一种基于拥有自己的 PropertySource 来实现该目标的方法,该 PropertySource 旨在允许合理地覆盖值。

如果您阅读 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config您将看到特定于配置文件的应用程序属性只是可用的属性来源之一,并且 JNDI 属性将覆盖特定于配置文件的属性。

分析 JEE 环境的 Spring Boot 属性覆盖顺序 (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config),JNDI 属性实际上具有最高优先级:

  • 我建议不要使用全局设置,如全局属性文件、命令行参数、系统环境变量等,因为它们由部署在同一应用服务器中的所有应用程序共享。
  • 您将获得附带好处:无需修改 Weblogic 启动文件
  • ServletConfig 和 ServletContext init 参数不是外部配置,使用它们意味着您必须为每个环境打包应用程序。

  • 请注意,要激活配置文件,您必须使用全局变量,因此同一应用服务器中的所有部署应用程序将激活相同的配置文件。

    因此,实际上,在纯 JEE 环境的 Spring Boot 应用程序中,您只有两个配置源:
  • JNDI 属性
  • 打包的 application.properties

  • 请注意,您应该避免使用打包的 application-{profile}.properties 文件,因为配置文件激活意味着在部署在同一应用服务器中的所有应用中激活相同的配置文件。

    在那一点上,您可以想象您在纯 JEE* 中拥有的唯一外部配置源是 JNDI。

    [*] “纯 JEE”是指不使用 Spring Cloud Config ( https://cloud.spring.io/spring-cloud-config/ ) 等外部配置服务器。

    也就是说,Weblogic 部署计划为您提供了为每个部署加载 JNDI 属性的最简单和舒适的方法,并且 Spring Boot 将从 JNDI 填充 Spring Environment。

    解决方案非常简单:
  • 部署您的应用程序和为您的环境(开发、预制、专业、...)定制的 Weblogic 部署计划
  • 将应用程序中的 JNDI 属性值用作任何其他 Spring Environment 属性:application.properties 中的 ${jndi.var}、@Value(${jndi.var}) 等。
  • 请注意,Spring Boot 将使用 JNDI 属性填充 Spring Environment,因此您可以像使用 application.properties 文件中的属性一样使用它们。

  • 希望能帮助到你!

    关于spring - 网络逻辑 12c : How to pass the "active profile" to a Spring Boot application?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40428943/

    相关文章:

    java - 用于自定义 Servlet 的 Spring Boot Actuator

    java - 如何调试 Spring 注解?

    java - 获取调用应用程序的 URL

    java - 如何在WEBLOGIC 9.2服务器中使用JNDI访问Hibernate的SessionFactory?

    java - 如何在 Weblogic 10.3.x 上利用 EL 2.2 功能?

    java - 为什么 Spring 中没有 DI 缓存就无法工作?

    java - 在 Play 框架 2.1 中集成 Spring 和 Hibernate?

    Spring env,我还应该在新项目中使用 Hystrix

    java - 用户 'root' @'localhost' Spring Boot MySql 访问被拒绝

    java - 如何使用Spring Security配置不同的路径?