当前位置: 首页 > 知识库问答 >
问题:

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

齐昊
2023-03-14

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

我试图找到一种方法将默认的Spring活动配置文件(此处和此处的信息)传递给应用程序,而不必在机器本身设置环境变量。如果可能的话,我希望能够使用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。配置文件。使用Weblogic激活Spring?我需要传递“dev”、“acc”或“prod”。

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

更新2:允许每个环境拥有自己的application.properties文件的一种方法是使用部署计划。这可能是推荐的方法。我会补充这一点作为回答,但我仍然倾向于更简单的方法...我不敢相信当应用程序部署在Weblogic中时,不可能简单地将参数传递给它!如果“环境/服务器/MyServer/服务器启动/参数选项不能用于此目的,它是什么?

更新3:相关线程。如果我理解正确,“环境/服务器/MyServer/服务器启动/参数”选项可能只有在启用NodeManager的情况下才有效?这将解释为什么我无法传递那个spring.profiles.active=dev变量!


共有3个答案

微生令
2023-03-14

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

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

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

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

毛镜
2023-03-14

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

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

由于您在WAR中打包了多个属性文件(不推荐,而是在WAR之外提取动态属性),因此可以使用@PropertySource(value=“classpath:application.dev.properties”)以应用程序使用的特定属性文件为目标。

你可以看看这里

堵飞鸿
2023-03-14

尽管Spring配置文件允许我们使用属于同一逻辑组(名为profile)的属性集填充Spring环境,但Spring配置文件不是目标,而是实现目标的方法之一。

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

Spring Boot提供了一种实现该目标的方法,该方法基于拥有自己的属性源,该属性源旨在允许明智地覆盖值。

如果您阅读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启动文件

    注意:要激活配置文件,必须使用全局变量,以便同一应用服务器中所有部署的应用程序都将激活相同的配置文件。

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

    1. JNDI属性
    2. 包装application.properties

    注意,您应该避免使用打包的应用程序{profile}。属性文件,因为配置文件激活意味着在同一应用服务器中部署的所有应用程序中激活相同的配置文件。

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

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

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

    解决方案非常简单:

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

      希望有帮助!

 类似资料:
  • 我想把<代码>工作流程。睡眠调用我的Cadence活动之一,以便能够正确测试它(并模拟function产生的错误结果)。 在实现之前,我注意到两件重要的事情: 和是单独的类型。 每个活动的第一个参数 - - 是可选的,可以省略 我的尝试: 1.首次尝试 错误: "error":"无法解码活动函数输入字节错误:无法解码参数:0,*internal.Context,json错误:json:无法将对象散

  • 当我运行pyspark program interactive shell时,可以获取pyspark脚本中的配置文件(config.ini),但当我试图使用Spark submit命令和主纱运行相同的脚本时,并且集群部署模式是集群,因为配置文件不存在,所以它给了我错误,我检查了纱日志,可以看到相同的,下面是运行pyspark作业的命令。

  • 问题内容: 我是webpack的新手,几乎可以解决所有构建部分的问题,但是现在的问题是,我想将环境变量从.env文件传递到webpack config,以便可以通过插件将这些变量传递给我的构建文件。 目前,我能够将环境变量直接从webpack传递到我的构建中。请查看下面我在webpack中使用的代码。 我的构建脚本是 问题答案: 您可以为此目的使用包装 参考:https : //www.npmjs

  • 我有三节课 1.菜单活动 2.LocationUpdateService 3.多重标记器 1.菜单活动 2、LocationUpdateService:(这是服务类) 3、多重标记(活动) 我的问题是:当我打开我的菜单活动我的Toast消息打印发送数据到广播接收器,然后点击按钮我调用MultipleMarker。我无法从服务中获取值。。。但当我按下后退按钮时,我重定向到MenuActivity,此

  • 问题内容: 我正在这样运行我的JavaFX应用程序: 类扩展。在特殊的FX线程中启动JavaFX窗口,但是在我的main方法中,我什至没有类的实例。 如何将非字符串参数(在我的情况下为 控制器 )传递给实例?它是有缺陷的设计吗? 问题答案: 通常,除了传递给您的主程序的程序参数外,无需将参数传递给主应用程序。想要这样做的唯一原因是创建一个可重用的对象。但这并不需要是可重用的,因为这是组装您的应用程