使用 Maven 配置文件配置基于 Spring 应用程序的代码

Using maven profiles to configure code based a Spring application

我有一个 Spring 应用程序,它是基于完整代码配置的。我正在尝试结合 Maven 配置文件来设置我的数据库连接。我为本地、实时和暂存问题定义了一些属性。现在我尝试控制 Maven 配置文件。每个配置文件都定义了我的 MySql 数据库连接参数。这是我当前的设置:

local.properties-文件:

mysql.username=test
mysql.password=test
mysql.databaseUrl=jdbc:mysql://localhost:3306/test
mysql.databaseDriver=com.mysql.jdbc.Driver

pom.xml

...
<profiles>
        <profile>
            <id>live</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <filterFile>src/main/config/live.properties</filterFile>
            </properties>
        </profile>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <filterFile>src/main/config/local.properties</filterFile>
            </properties>
        </profile>
        <profile>
            <id>staging</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <filterFile>src/main/config/staging.properties</filterFile>
            </properties>
        </profile>
    </profiles>
...

应用配置

...
@Value("${mysql.username}")
    private String username;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername(username);
        ..

        return dataSource;
    }
...

这里的问题是我的属性没有加载!

您在 Maven 构建期间设置了一个名为 filterFile 的 属性,但您实际上需要将值放入您的应用程序,然后您必须使用它来查找文件加载。

一个可能更好的方法是将变量值定义为 pom 中的属性:

<profiles>
    <profile>
        <id>live</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <mysql.username>test</mysql.username>
            <mysql.password>test</mysql.password>
            <mysql.databaseUrl>jdbc:mysql://localhost:3306/test</mysql.databaseUrl>
        </properties>
    </profile>
    <!-- ... -->
</profiles>

然后启用资源过滤:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

在文件中,例如persistence.properties:

mysql.username=${mysql.username}
mysql.password=${mysql.password}
mysql.databaseUrl=${mysql.databaseUrl}
mysql.databaseDriver=com.mysql.jdbc.Driver

最后,加载属性文件并创建数据源:

@PropertySource({"classpath:persistence.properties"})
public class DatabaseConfig {
    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername(env.getProperty("mysql.username"));
        // ...
        return dataSource;
    }
}