如何将 Spring Boot application.properties 外部化到 tomcat/lib 文件夹

2022-09-01 19:04:05

我需要一个免配置,可部署的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文件,并部署在任何服务器上。

我已经阅读了Spring文档,但它解释了如何在作为jar运行时设置位置:

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

对于多个共存的战争文件,我不知道如何做到这一点。

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


答案 1

一个解决方案可能是加载 application-{profile}.properties 作为@PropertySource注释,正如这个问题所建议的那样,但随后日志记录系统将无法正常工作,如文档中所示。

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

这意味着您在 application-{profiles}.properties 中的日志记录属性,如下所示:

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

将被忽略,日志记录系统将无法正常工作。

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

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库的范围设置为“提供”。此外,要从最终战争中排除 src/main/resources/myapp1 中的所有属性文件,并生成一个免配置、可部署的 war:

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

然后在雄猫我有

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

现在我可以生成免配置战争并将其放入apache-tomcat-7.0.59 / webapps文件夹中。属性文件将使用类路径进行解析,对于每个 Web 应用,将单独解析:

   apache-tomcat-7.0.59/lib/myapp1
   apache-tomcat-7.0.59/lib/myapp2
   apache-tomcat-7.0.59/lib/myapp3

答案 2

在 Linux serveur 上使用 Spring 4.2 和 @Annotation config 和 tomcat

在应用程序类中,设置@PropertySource如下所示:

@Configuration
@EnableWebMvc
@PropertySource(value = { "classpath:application-yourapp.properties"})
@ComponentScan(basePackages = "com.yourapp")
public class YourAppWebConfiguration extends WebMvcConfigurerAdapter {

    ...
}

现在,您只需要将属性文件包含在类路径中

生产中

在tomcat上部署你的.war文件(或任何东西),并把你的应用程序-yourapp.properties放在你的生产机器上。( for exemple in /opt/applyconfigfolder/application-yourapp.properties“ )

然后在你的雄猫 (这里雄猫 7 ) 打开bin\catalina.sh

你有这行

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

只需添加包含 application.properties 的文件夹的路径

CLASSPATH=:/opt/applyconfigfolder

如果已经有一些类路径定义,则可以添加它

CLASSPATH=:/opt/applyconfigfolder:/yourpath1:/yourpath2:

我没有尝试过窗户,但我认为没有问题

在 Dev ( 与日食 )

├src
| └main
|   └ ....
└config
| └application-yourapp.properties

而不是src/main/resources/application-yourapp.properties

现在,在 eclipse 中,将配置文件夹添加到类路径,转到 tomcat 服务器(或等效服务器)的“运行配置”,然后将文件夹 Config 添加到用户条目

enter image description here

好了,就是这样,您的 application.properties 不在应用程序中,您的项目在开发环境中完美运行。


推荐