我正在开发一个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。这可能是推荐的方法。我将此作为答案添加,但我仍然倾向于采用更简单的方法......我无法相信,只有将参数传递给应用程序才能实现, #39;部署在Weblogic中!如果它不能用于此目的,那么" Environment / Servers / MyServer / Server Start / Arguments
选项是什么?
更新3 :Related thread。如果我理解正确的话," Environment / Servers / MyServer / Server Start / Arguments
"选项可能仅在启用NodeManager时有效?这可以解释为什么我无法传递spring.profiles.active=dev
变量!
答案 0 :(得分:2)
您可以使用application.properties
设置有效个人资料,如下所示:
# PROFILES
spring.profiles.active= # Comma-separated list of active profiles.
由于您在WAR中打包了多个属性文件(不建议使用,而是在战争之外提取动态属性),您可以使用@PropertySource(value = "classpath:application.dev.properties")
来定位应用程序使用的特定属性文件。 / p>
您可以查看here
答案 1 :(得分:2)
尽管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环境。
解决方案非常简单:
希望它有所帮助!
答案 2 :(得分:1)
我们使用类似的工作方式,但有一些重大差异:
在我看来,尝试将Spring配置文件用于您想要的内容,可能会导致一些微妙的catch22情况。
我们更喜欢使用Spring配置文件来区分重要的bean定义更改,同时使用绑定到部署环境的属性来区分这些bean的配置方式。
答案 3 :(得分:1)
我会将此作为答案添加,因为 是实现我想要做的事情的一种方式,但我真的会更喜欢更简单的方法。请参阅我的问题的“更新2 ”部分......
此解决方案是使用Deployment Plans。这允许每个环境覆盖应用程序中的资源,包括application.properties
文件。
答案 4 :(得分:0)
我知道我可能会迟到,但我一直在与同样的问题作斗争。提供的大多数答案并没有真正指定当您的应用程序必须部署到不同的环境服务器时如何进行。因此,在进行了一些挖掘之后,这是我发现和所做的:
application.properties
文件,其中包含以下内容:spring.profiles.active=<env>
其中 <env>
是您希望 Spring Boot 应用程序指向的环境。jar -cf <env>-profile.jar application.properties
。lib
目录,上传您刚刚在该目录中创建的 jar 文件并重新启动 Weblogic 服务器。重复,更改 <env>
环境,为要上传 Spring Boot 应用程序指向的所有服务器环境制作一个 jar。例如,对于测试,application.properties
文件将包含以下行:spring.profiles.active=test
并且 jar 将是 test-profile.jar