Weblogic 12c:如何将“活动配置文件”传递给Spring Boot应用程序?

问题描述 投票:5回答:4

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

我试图找到一种方法将默认的Spring活动配置文件(info 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

有没有想过是否可以使用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 spring-boot weblogic weblogic12c
4个回答
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属性实际上是最优先的:

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

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

因此,实际上,在纯JEE环境的Spring Boot应用程序中,您只有两个配置源:

  1. JNDI属性
  2. 打包的application.properties

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

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

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

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

解决方案非常简单:

  1. 部署应用程序和为您的环境定制的Weblogic部署计划(dev,pre,pro,...)
  2. 在应用程序中使用JNDI属性值作为任何其他Spring Environment属性:$ {jndi.var}在application.properties,@ Value($ {jndi.var})等中。 请注意,Spring Boot将使用JNDI属性填充Spring环境,因此您可以像使用application.properties文件中的属性一样使用它们。

希望能帮助到你!


2
投票

您可以使用application.properties设置活动配置文件,如下所示:

# PROFILES
spring.profiles.active= # Comma-separated list of active profiles.

由于您已在WAR中打包了多个属性文件(不建议使用,而是在战争之外提取动态属性),因此可以使用@PropertySource(value = "classpath:application.dev.properties")来定位应用程序要使用的特定属性文件。

你可以看看here


1
投票

我们使用类似的工作方式,但有一些主要的区别:

  • 我们使用-D机制将“DEPLOYMENT_ENV”属性传递给WebLogic,此DEPLOYMENT_ENV定义了部署环境(dev,test,acc,prod,...)
  • 此属性在不同的Spring配置机制中使用,使用表达式“classpath:configuration / $ {DEPLOYMENT_ENV} /some_property_filename.properties”从类路径加载特定属性
  • 在JUnit测试中,我们使用@TestPropertySource定义运行模式值
  • 我们不要使用Spring配置文件来区分部署环境,而是运行模式:默认(用于Web容器下的部署),test(在JUnit测试中我们使用@ActiveProfiles),以及其他一些......暗示更重要的更改定义的一组bean。

在我看来,尝试使用Spring配置文件来实现您的目的,可能会导致一些微妙的catch22情况。

我们更喜欢使用Spring配置文件来区分重要的bean定义更改,同时使用绑定到部署环境的属性来区分这些bean的配置方式。


1
投票

我将此作为答案添加,因为它是实现我想要做的事情的一种方式,但我真的会更喜欢更简单的方法。请参阅我的问题的“更新2”部分...

这个解决方案是使用Deployment Plans。这允许每个环境覆盖应用程序中的资源,包括application.properties文件。

© www.soinside.com 2019 - 2024. All rights reserved.