Maven构建Spring应用无法加载application-production.properties问题
Spring Boot + Vaadin 部署到 Azure 未加载生产环境配置问题
问题概述
本地通过设置 spring.profiles.active=production 启动应用时,能正常连接SQL Server数据库;但通过Maven构建后部署到Azure Container Apps,应用未加载生产配置(数据无法写入数据库),且代码已确认成功部署。
本地环境
- 生产模式:Java 19,指定profile为production,启动参数
-Dspring.profiles.active=production - 开发模式:Java 19,指定profile为development
部署命令
开发部署
mvn install -Pproduction; az login; az containerapp up --resource-group rg-group -n group-app-vaadin --source .;
生产部署
mvn install -Pproduction -Dspring.profiles.active=production; az login; az containerapp up --resource-group rg-group -n group-app-vaadin --source .;
Dockerfile 配置
FROM eclipse-temurin:21-jre COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
配置文件
application.properties
server.port=${PORT:8080} logging.level.org.atmosphere=warn spring.mustache.check-template-location=false # Launch the default browser when starting the application in development mode vaadin.launch-browser=true # increases max file size the server will accept spring.servlet.multipart.max-file-size=30MB spring.servlet.multipart.max-request-size=30MB # To improve the performance during development. vaadin.allowed-packages=com.vaadin,org.vaadin,com.GROUP,de.f0rce.signaturepad spring.jpa.defer-datasource-initialization=true spring.jpa.show-sql=true
application-production.properties
spring.jpa.defer-datasource-initialization=false spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.url=jdbc:sqlserver://GROUP.database.windows.net:1433;encrypt=true;trustServerCertificate=false;loginTimeout=30;database=GROUP-db; spring.datasource.username=USERNAME spring.datasource.password=PASSWORD
pom.xml(核心部分)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.group.app</groupId> <artifactId>group-webapp</artifactId> <name>Group Web App</name> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <java.version>17</java.version> <vaadin.version>24.4.6</vaadin.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.7</version> </parent> <build> <defaultGoal>spring-boot:run</defaultGoal> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>${vaadin.version}</version> <executions> <execution> <goals> <goal>prepare-frontend</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> <id>production</id> <dependencies> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-core</artifactId> <exclusions> <exclusion> <groupId>com.vaadin</groupId> <artifactId>vaadin-dev</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>${vaadin.version}</version> <executions> <execution> <goals> <goal>build-frontend</goal> </goals> <phase>compile</phase> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <activatedProperties>development</activatedProperties> </properties> </profile> </profiles> </project>
已尝试的排查步骤
- 尝试调试Maven构建过程,查看配置文件加载情况,未取得有效结果
- 执行
mvn clean和mvn clean -Pproduction后重新构建部署 - 将
application.properties内容替换为application-production.properties的配置,部署后问题依旧
问题根源及解决方案
1. Maven构建参数未传递到运行阶段
Maven构建时的 -Dspring.profiles.active=production 参数仅作用于构建过程,不会被打包到Jar包中。Azure部署时启动Jar包未传入该参数,应用默认加载development profile(pom中development profile为默认激活状态)。
解决办法:
方法一:修改Dockerfile添加启动参数
直接在启动命令中指定生产环境profile:FROM eclipse-temurin:21-jre COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-Dspring.profiles.active=production", "-jar", "/app.jar"]方法二:通过Azure配置环境变量
使用CLI或Azure门户设置环境变量,Spring Boot会自动读取SPRING_PROFILES_ACTIVE:az containerapp update --resource-group rg-group --name group-app-vaadin --set environmentVariables[0].name=SPRING_PROFILES_ACTIVE --set environmentVariables[0].value=production
2. 确认依赖完整性
检查pom.xml是否已添加SQL Server驱动依赖:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency>
若缺少驱动,即使加载生产配置也无法连接数据库。
3. 验证配置生效状态
部署后查看Azure Container Apps日志,搜索关键字 The following profiles are active:,确认输出包含 production。若仍显示development,需重新检查启动参数或环境变量配置。
内容的提问来源于stack exchange,提问作者Kendricks L Camille
相关产品推荐
相关产品推荐

