如何在非Spring环境下用环境变量替换persistence.xml中的账号密码
替换persistence.xml硬编码凭据为环境变量的方案
针对你的非Spring+Hibernate JPA项目,这里提供两种可行的方案来替换persistence.xml中的硬编码用户名和密码:
方案一:代码动态注入环境变量
直接在创建EntityManagerFactory时,通过代码读取环境变量并覆盖persistence.xml中的属性,这是最直接且无需修改构建配置的方式。
步骤:
- 保留persistence.xml中的其他配置,可将用户和密码的value留空或保留默认值(代码会覆盖):
<!-- persistence.xml中修改这两行 --> <property name="javax.persistence.jdbc.user" value=""/> <property name="javax.persistence.jdbc.password" value=""/>
- 在创建EntityManagerFactory的代码中,读取环境变量并传入Properties:
import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import java.util.Properties; public class HibernateUtil { private static final EntityManagerFactory emf; static { try { Properties props = new Properties(); // 读取环境变量 String dbUser = System.getenv("DB_USER"); String dbPassword = System.getenv("DB_PASSWORD"); props.put("javax.persistence.jdbc.user", dbUser); props.put("javax.persistence.jdbc.password", dbPassword); // 传入persistence单元名称和自定义属性 emf = Persistence.createEntityManagerFactory("com.zegasoftware.jpa", props); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static EntityManagerFactory getEntityManagerFactory() { return emf; } }
- 运行项目前设置环境变量:
- Linux/macOS终端:
export DB_USER=你的用户名 export DB_PASSWORD=你的密码 java -jar 你的项目.jar
- Windows命令行:
set DB_USER=你的用户名 set DB_PASSWORD=你的密码 java -jar 你的项目.jar
方案二:Maven资源过滤构建时替换
利用Maven的资源过滤功能,在构建阶段将persistence.xml中的占位符替换为环境变量的值,适合需要打包后直接运行的场景。
步骤:
- 修改persistence.xml,将用户名和密码替换为Maven占位符:
<property name="javax.persistence.jdbc.user" value="${db.user}"/> <property name="javax.persistence.jdbc.password" value="${db.password}"/>
- 在pom.xml中配置资源过滤,开启对persistence.xml的变量替换:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 只过滤persistence.xml,避免影响其他资源文件 --> <includes> <include>META-INF/persistence.xml</include> </includes> </resource> <!-- 其他资源文件不开启过滤 --> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>META-INF/persistence.xml</exclude> </excludes> </resource> </resources> </build>
- 构建项目时通过环境变量传入值:
- Linux/macOS:
mvn clean package -Ddb.user=$(echo $DB_USER) -Ddb.password=$(echo $DB_PASSWORD)
- Windows:
mvn clean package -Ddb.user=%DB_USER% -Ddb.password=%DB_PASSWORD%
也可以在pom.xml的properties中设置默认值,构建时通过命令行覆盖:
<properties> <!-- 可选默认值 --> <db.user>postgres</db.user> <db.password>默认密码</db.password> </properties>
注意事项
- 方案一适合开发阶段快速测试,无需修改构建流程;方案二更适合生产环境打包部署,确保配置不硬编码在代码中。
- 确保环境变量已正确设置,避免空值导致数据库连接失败。
内容的提问来源于stack exchange,提问作者Cosmin
相关产品推荐
相关产品推荐

