我有一个Java Spring Web项目。它分为几个maven模块和项目。目前,每个工件都有一个application-context.xml和一个default.properties(因此每个项目都可以独立运行。)我基本上使用基于注释的bean创建和@Value注释来获取属性。
聚合webapp项目(当然)有每个构建目标的pom和属性文件。
我现在的问题是:感觉有点混乱。 pom有几个配置文件,每个构建服务器一个,包含构建时maven所需的属性(目标服务器url)或必须在配置文件(log4j smtp host)中替换的属性。然后,我有每个构建系统的属性文件,我使用$ {maven.variables}并覆盖包含的工件(如数据库,电子邮件配置等)中的默认变量。
由于实时和测试服务器之间的许多方面不同,属性随着时间的推移而增长。项目中的新开发人员很难设置他们的项目,尽管基本上他们应该只使用某种dev-default +你的数据库凭证。
如何处理构建/运行时的属性?
编辑:另一件令我烦恼的事情:目前,属性无法验证(如果它们存在,发现拼写错误是一项耗时的任务......)。也许有一个解决方案吗?
答案 0 :(得分: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作业中我使用测试配置文件。
答案 1 :(得分: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's)的一个问题是,如果您需要更改这些文件,则必须重新构建或编辑工件。如果这是一个问题,也许最好将这些属性文件保留在工件之外,并将它们从外部提供给应用程序服务器。有关解决方案,请参阅this answer。
关于验证属性。是的,这是一个问题。我见过的最接近的是enforcer plugin。