Weblogic 12c:如何传递"活跃的个人资料"到Spring Boot应用程序?

时间:2016-11-04 17:51:27

标签: spring spring-boot weblogic weblogic12c

我正在开发一个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。这可能是推荐的方法。我将此作为答案添加,但我仍然倾向于采用更简单的方法......我无法相信,只有将参数传递给应用程序才能实现, #39;部署在Weblogic中!如果它不能用于此目的,那么" Environment / Servers / MyServer / Server Start / Arguments选项是什么?

更新3 Related thread。如果我理解正确的话," Environment / Servers / MyServer / Server Start / Arguments"选项可能仅在启用NodeManager时有效?这可以解释为什么我无法传递spring.profiles.active=dev变量!

5 个答案:

答案 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属性实际上是最优先的:

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

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

    1. JNDI属性
    2. 打包的application.properties
    3. 请注意,您应该避免使用打包的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 Environment,因此您可以像使用application.properties文件中的属性一样使用它们。
      3. 希望它有所帮助!

答案 2 :(得分:1)

我们使用类似的工作方式,但有一些重大差异:

  • 我们通过了" DEPLOYMENT_ENV"使用-D机制向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的配置方式。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我知道我可能会迟到,但我一直在与同样的问题作斗争。提供的大多数答案并没有真正指定当您的应用程序必须部署到不同的环境服务器时如何进行。因此,在进行了一些挖掘之后,这是我发现和所做的:

  1. 创建一个 application.properties 文件,其中包含以下内容:spring.profiles.active=<env> 其中 <env> 是您希望 Spring Boot 应用程序指向的环境。
  2. 使用以下命令将其包装为 jar 文件:jar -cf <env>-profile.jar application.properties
  3. 在您的 WebLogic 服务器域中有一个 lib 目录,上传您刚刚在该目录中创建的 jar 文件并重新启动 Weblogic 服务器。

重复,更改 <env> 环境,为要上传 Spring Boot 应用程序指向的所有服务器环境制作一个 jar。例如,对于测试,application.properties 文件将包含以下行:spring.profiles.active=test 并且 jar 将是 test-profile.jar