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

如何将Spring Boot Application.Properties外部化到Tomcat/lib文件夹

呼延俊风
2023-03-14

我需要一个自由配置、可部署的war,MYAPP1.war,它可以从Tomcat/lib文件夹中检索配置文件。由于我有其他web应用程序共存于同一Tomcat上:myApp2.war、myApp3.war,所以我需要这样的布局:

tomcat/lib/myapp1/application.properties
tomcat/lib/myapp2/application.properties
tomcat/lib/myapp3/application.properties

这样,我就可以构建war文件,而不需要war中的任何属性文件,并将其部署在任何服务器上。

我读过Spring文档,但它解释了当作为JAR运行时如何设置位置:

java -jar myapp.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

我不知道如何在多个war文件共存的情况下做到这一点。

我想知道这是否可能,或者我应该放弃Spring Boot而回到传统的Spring MVC应用程序。

共有1个答案

郎泰平
2023-03-14

一个解决方案可以是按照这个问题的建议加载application-{profile}.properties作为@PropertySource注释,但这样日志记录系统就无法工作了,正如您在文档中看到的那样。

日志系统是在应用程序生命周期的早期初始化的,因此在通过@PropertySource注释加载的属性文件中不会找到日志属性。

这意味着您在application-{profiles}中的日志属性。属性如:

logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log

则日志记录系统将无法工作。

为了解决这一问题,我使用了SpringApplicationBuilder.properties()方法在开始配置应用程序时加载属性。在这里,我设置了Spring Boot用来加载所有应用程序的“Spring.config.location”-{profiles}。属性:

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }
}

然后将属性文件从src/main/resources移动到src/main/resources/myapp1

.
├src
| └main
|   └resources
|     └myapp1
|       └application.properties
|       └application-development.properties
|       └logback.xml
└─pom.xml

在pom.xml中,我必须将嵌入式tomcat库的范围设置为“Provided”。此外,要从最终war中排除src/main/resources/myapp1中的所有属性文件,并生成一个无需配置的、可部署的war:

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <packagingExcludes>
              **/myapp1/
            </packagingExcludes>
        </configuration>
    </plugin>

在Tomcat我有

├apache-tomcat-7.0.59
 └lib
   ├─myapp1
   |  └application.properties        
   |  └logback.xml
   └─myapp2
     └application.properties
     └logback.xml

现在我可以生成配置自由war,并将其放入apache-tomcat-7.0.59/webapps文件夹。属性文件将使用类路径进行解析,每个WebApp都是独立的:

   apache-tomcat-7.0.59/lib/myapp1
   apache-tomcat-7.0.59/lib/myapp2
   apache-tomcat-7.0.59/lib/myapp3
 类似资料:
  • 问题内容: 我需要一个免费的,可部署的配置项myapp1.war,它可以从tomcat / lib文件夹中检索配置文件。由于我在同一个Tomcat上同时存在其他Web应用程序:myapp2.war,myapp3.war,因此需要以下布局: 这样,我可以构建战争文件,而无需在战争内部创建任何属性文件,然后将其部署在任何服务器上。 我已经阅读了Spring文档,但是它解释了以jar运行时如何设置位置:

  • 问题内容: 我想将我的react组件打包为一个lib。 下面是webpack我的设置: 然后以这种方式在我的其他组件中要求包装后 并且上述组件的webpack设置是: 编译文件后,它显示错误: 我认为错误是来自外部设置,原因是在我删除后,它可以工作。 我搜索了一些相关的答案,但无法解决。 有人对此有任何想法吗?谢谢。 问题答案: 我找到了答案! 原因是需要设置不同的外部值(参考doc)。 由于我将

  • 问题内容: 我在Tomcat 7中配置Web应用程序时遇到问题。在我的WAR文件中,有一个属性文件,它包含特定于环境的属性。我试图在服务器上覆盖该配置文件,以便将同一WAR文件部署到多个环境。 我听说有一种方法可以使用中的替换配置文件来执行此操作。这是我很难弄清楚的方法。 另外,是同一台Tomcat服务器上运行的许多软件之一,它不能作为本地主机运行。我希望能够为多个Web应用程序解决此问题。 问题

  • 我使用Intellij IDEA11.1.2终极版。我从Intellij IDEA运行Tomcat6。在我的。war应用程序旁边,我还有一个包含静态HTML文件的文件夹。当我从命令行手动运行tomcat时,我将该文件夹放在tomcat的webapp文件夹下,它会自动部署该文件夹并工作。但是,我想调试我的应用程序,所以我想从Intellij IDEA运行Tomcat。我认为Intellij的想法将t

  • 问题内容: 如何使用Tomcat从Web应用程序外部的公共文件夹中提供图像文件?我不想在其他端口上使用第二个Apache文件服务器,因为图像文件是同一应用程序的一部分。而且我不想在webapps内部创建指向公共文件夹的符号链接,因为我的应用程序被部署为war文件....是否有一个更简单的解决方案,类似于将默认servlet用于webapps内部的静态内容,用于webapps外部的静态内容 问题答案

  • 问题内容: 我在装有Tomcat 8的同一服务器上运行Jenkins 1.6(并且也尝试使用Jenkins 2.0)。我需要将Maven多模块应用程序部署到Tomcat Web应用程序。它有两个必须部署的子模块中的war文件。Deploy插件最多支持Tomcat 7,并且工作正常。但是,问题是我需要使用Tomcat 8,因为我的Web应用程序无法在Tomcat 7上运行。是否可以将War文件从Je