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

Setting per application properties on Wildfly

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

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

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

我没有找到任何与 Wildfly 类似的文档/功能。你能告诉我如何单独设置应用程序的属性,或者给我指点文档吗?

谢谢。 :-)

我想,我找到了解决这个问题的方法。假设,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);
  }
}

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

在 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中添加依赖<module name="my.group.app1.conf" export="true" />
  • 在 Spring XML 中,假设您在配置模块中有一个名为 my-app.properties 的文件属性可以加载到上下文中:

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

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

对我来说,以下方法有效。 首先,我更改了应用程序属性的名称。 其次,我使用 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);
     }
}