在 Wildfly 上设置每个应用程序的属性

Posted

技术标签:

【中文标题】在 Wildfly 上设置每个应用程序的属性【英文标题】:Setting per application properties on Wildfly 【发布时间】:2017-04-25 08:56:15 【问题描述】:

我通常是 Tomcat 的人,但我们在我们的一个客户项目中使用 Widfly。

使用 Tomcat,我可以通过为每个应用程序创建单独的上下文来设置“每个应用程序”属性,就像 Tomcat documentation very nicely says。

这样,我的WebApp1.war可以和my.property.value=Cat一起运行,WebApp2.war可以同时和my.property.value=Dog一起运行。

我没有找到任何与 Wildfly 类似的文档/功能。您能否建议我如何为应用程序单独设置属性,或指向文档?

谢谢。 :-)

【问题讨论】:

您在寻找什么类型的房产?喜欢系统属性? 应用程序属性。像这些:docs.spring.io/spring-boot/docs/current/reference/html/… 我想设置例如“spring.datasource.url”,为不同的应用程序设置不同的值。 看起来你只需在部署中包含一个application.properties 文件,除非我遗漏了什么。这实际上取决于应用程序以及这些属性如何在可以设置的位置读取。 我只是不确定这里可以做什么。使用application.propertiesweb.xml 似乎是我将配置保留在部署中的唯一方法。一般来说,容器配置是全局的。 好的,我现在假设这是 Wildfly 的限制,我会尝试找到解决方法。 Tomcat 允许单个容器中的每个上下文属性 - 我可以为每个应用程序拥有更多配置文件。无论如何,感谢您的帮助 - 至少我知道我必须使用解决方法。 【参考方案1】:

在 Wildfly 中,您可以创建包含属性的模块:

$JBOSS_HOME/modules 下,添加类似 my/group/app1/conf/main 的目录。

$JBOSS_HOME/modules/my/group/app1/conf/main下,创建文件module.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="my.group.app1.conf">
        <resources>
                <resource-root path="." />
                <!-- Insert resources here -->
        </resources>
</module>

复制您的 *.properties 文件到 $JBOSS_HOME/modules/my/group/app1/conf/main

在WebApp1.war的jboss-deployment-structure.xml中添加为依赖&lt;module name="my.group.app1.conf" export="true" /&gt;

在 Spring XML 中,假设您在配置模块中有一个名为 my-app.properties 的文件,可以将属性加载到上下文中:

<context:property-placeholder
        location="classpath*:*my-app.properties"
        local-override="false"
        ignore-unresolvable="false"/>

要为 WebApp2.war 配置模块,只需重复上述步骤,但新模块必须有自己的唯一名称。

【讨论】:

谢谢,模块似乎是最干净的方式。【参考方案2】:

我想,我找到了解决这个问题的方法。假设app1.warapp2.war 是不同的战争,不同的名称并不相同。

然后您可以在运行时使用应用程序初始化过程为每个应用程序定义不同的spring.config.name。而不是application.properties,而是每个WAR(以及每个jar)寻找一个特定于应用程序的称为属性文件。

/** Main Entry Point for this Application */
@SpringBootApplication(scanBasePackages = "de.mach.selfservices")
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer 

  // JAR init
  public static void main(String[] args) 
    SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
    if (!System.getProperties().containsKey("spring.config.name")) 
      builder = builder.properties("spring.config.name:app1");
    
    builder.run(args);
  

  // WAR init
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) 
    if (!System.getProperties().containsKey("spring.config.name")) 
      builder = builder.properties("spring.config.name:app1");
        
    return builder.sources(Application.class);
  

然后第二个应用程序在spring.config.name 中有app2。在这两种情况下,SpringBoot 的默认行为都符合预期。它在 WAR/JAR 的内部和外部查找 app1.propertiesapp2.properties。所以你可以在wildfly/standalone/configuration中放两个文件,可以独立配置两个WAR。

【讨论】:

【参考方案3】:

对我来说,以下方法有效。 首先,我更改了应用程序属性的名称。 其次,我使用 Wildfly 配置路径更改了配置文件的路径。

@SpringBootApplication
public class Application extends SpringBootServletInitializer 

     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) 
       String configPath = System.getProperties().getProperty("jboss.server.config.dir") + "/";
       return builder
                    .properties("spring.config.name:my-app")
                    .properties("spring.config.location:" + configPath)
                    .sources(Application.class);
     
     
     public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
     

【讨论】:

以上是关于在 Wildfly 上设置每个应用程序的属性的主要内容,如果未能解决你的问题,请参考以下文章

WildFly中的每主机或每部署子系统配置

如何禁用 Wildfly 9.0.2 尝试序列化集群应用程序中的某些类

Wildfly 集群设置问题

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

WildFly 中的字符集编码

Spring Boot 应用程序未部署在 Wildfly 上