0

我有一个 Java Spring Web 项目。它分为几个maven模块和项目。目前,每个工件都有一个 application-context.xml 和一个 default.properties(因此每个项目都可以独立运行。)我基本上使用基于注释的 bean 创建和属性的 @Value 注释。

聚合 webapp 项目(当然)具有每个构建目标的 pom 和属性文件。

我现在的问题是:感觉有点混乱。pom 有多个配置文件,每个构建服务器一个,并包含 maven 在构建时需要的属性(目标服务器 url)或必须在配置文件中替换的属性(log4j smtp 主机)。然后,我有每个构建系统的属性文件,我在其中使用 ${maven.variables} 并覆盖包含的工件(如数据库、电子邮件配置等)中的默认变量。

这些属性随着时间的推移而增长,因为实时服务器和测试服务器之间的许多方面都不同。项目中的新开发人员很难设置他们的项目,尽管基本上他们应该只使用某种 dev-default + 你的数据库凭据。

您如何处理构建/运行时的属性?

编辑:让我烦恼的另一件事:目前无法验证属性(如果存在,查找拼写错误是一项耗时的任务......)。也许有解决方案吗?

4

2 回答 2

0

Vinh Ta 的方法可行,但出现的一个问题是您需要为每个排列(开发、测试、生产等)构建一个新的工件。您可以将所有属性文件放在 src/main/resources 目录中(资源插件会自动选择它们)。然后,您可以使用环境变量控制在 Java 中使用的属性文件的版本。

/Project  
-/src/main/
--/resources/
---filter.dev.properties
---/filter.test.properties
pom.xml

然后,您可以通过在每台服务器上设置环境变量来构建一个工件并部署到多台服务器。这也可以通过在命令行上设置的 java 属性来完成。

String resource = "filter"+System.getenv("ENV")+".properties";
this.getClass().getResourceAsStream(resource);

上述方法(和 Vinh Ta 的)的一个问题是,如果您需要更改这些文件,则必须重新构建或编辑工件。如果这是一个问题,也许最好将这些属性文件留在工件之外,并将它们提供给外部的应用程序服务器。请参阅此答案以获取解决方案。

至于验证属性。是的,这是一个问题。我见过的最接近的是enforcer plugin

于 2013-04-22T17:55:27.397 回答
0

不确定如何为构建环境设置 maven 项目,但我对大多数项目使用 maven 资源插件。

项目结构(标准maven结构)

/Project
-/src
--/filters
---/filter.dev.properties
---/filter.test.properties
--/java
--/resources
---/config.properties
pom.xml

应用程序代码使用 config.properties(或其他应用程序配置文件)来配置自身。我有每个环境的过滤器文件,这些文件只保存特定于环境的值,这些将替换 config.properties 中的占位符

我的 POM 文件

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
    <filters>
        <filter>src/main/filters/filter.${env}.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>dev</env>
        </properties>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <env>test</env>
        </properties>
    </profile>
</profiles> 

默认情况下,当我在本地构建时,我不向 maven 提供配置文件,它将使用 filter.dev.properties 来构建测试环境,在我的 Jenkins 工作中,我使用测试配置文件。

于 2013-04-20T01:06:20.277 回答