使用 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;
}
}
我有一个 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;
}
}