Использование профилей maven для настройки кода на основе приложения Spring

У меня есть приложение Spring, которое полностью настроено на основе кода. И я пытаюсь объединить профили Maven для настройки моих соединений БД. Я определил некоторые свойства для локальных, живых и постановочных задач. Теперь я пытаюсь получить контроль над профилями Maven. Каждый профиль определяет мои параметры соединения MySql db. Вот моя текущая настройка:

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>
...

ApplicationConfig

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

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

        return dataSource;
    }
...

Проблема здесь в том, что мои свойства не загружены!

1 ответ

Решение

Вы устанавливаете свойство под названием filterFile во время сборки maven, но на самом деле вам нужно получить значение в ваше приложение, которое затем вам нужно будет использовать для поиска файла для загрузки.

Потенциально лучший способ сделать это - определить значения переменных как свойства в вашем 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;
    }
}
Другие вопросы по тегам