我正在开发一个Spring Boot应用程序,我必须让它在我们的Weblogic 12c
服务器上运行,作为一场战争。
我试图找到一种方法将默认的Spring活动配置文件(info here和here)传递给应用程序,而无需在机器本身上设置环境变量。如果可能的话,我希望能够使用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
有没有想过是否可以使用Weblogic将spring.profiles.active
传递给Spring?我需要通过“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环境,也就是说,目标是能够在不同环境中部署相同的应用程序代码,并为每个单一环境加载特定配置。
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属性实际上是最优先的:
请注意,要激活配置文件,您必须使用全局变量,因此同一应用服务器中的所有已部署应用程序将激活相同的配置文件。
因此,实际上,在纯JEE环境的Spring Boot应用程序中,您只有两个配置源:
请注意,您应该避免使用打包的application- {profile} .properties文件,因为配置文件激活意味着在同一个应用服务器中部署的所有应用中激活相同的配置文件。
在这一点上,您可以想象纯JEE *中唯一的外部配置源是JNDI。
[*]“纯JEE”是指不使用Spring Cloud Config(https://cloud.spring.io/spring-cloud-config/)等外部配置服务器。
也就是说,Weblogic部署计划为您提供了为每个部署加载JNDI属性的最简单,最舒适的方式,Spring Boot将从JNDI填充Spring环境。
解决方案非常简单:
希望能帮助到你!
您可以使用application.properties
设置活动配置文件,如下所示:
# PROFILES
spring.profiles.active= # Comma-separated list of active profiles.
由于您已在WAR中打包了多个属性文件(不建议使用,而是在战争之外提取动态属性),因此可以使用@PropertySource(value = "classpath:application.dev.properties")
来定位应用程序要使用的特定属性文件。
你可以看看here
我们使用类似的工作方式,但有一些主要的区别:
在我看来,尝试使用Spring配置文件来实现您的目的,可能会导致一些微妙的catch22情况。
我们更喜欢使用Spring配置文件来区分重要的bean定义更改,同时使用绑定到部署环境的属性来区分这些bean的配置方式。
我将此作为答案添加,因为它是实现我想要做的事情的一种方式,但我真的会更喜欢更简单的方法。请参阅我的问题的“更新2”部分...
这个解决方案是使用Deployment Plans。这允许每个环境覆盖应用程序中的资源,包括application.properties
文件。