构建项目时可能会遇到在测试(如单元测试)、开发、模拟、生产等不同环境下需要不同配置(properties、xml)或资源(jpg、png、mp3)的情况。比如常见的数据库连接(即 jdbc url)的值,在不同的环境下可能有如下几种值:
- 测试环境:jdbc:mysql://localhost:3306/foobar_test
- 开发环境:jdbc:mysql://localhost:3306/foobar_dev
- 模拟环境:jdbc:mysql://192.168.1.11:3306/foobar
- 生产环境:jdbc:mysql://192.168.1.10:3306/foobar
或者同样是生产环境,针对(产品)交付给A公司客户的与交付给B公司客户的需要不同配置或者资源,比如产品界面中的公司名称、公司LOGO等。
又或者针对不同的操作系统(如 Windows,Linux)需要为某个配置设定不同的文件路径。
可见,在不同的软件开发生命周期阶段、不同的最终客户(用户)环境、不同的运行平台都有可能需要不同配置或资源的情况。假如各个环境下的差别很小的话,我们可以在项目编译之后手工修改或者写个 shell script 自动修改,但如果需要修改的项目很多而且复杂的话,则应该使用 Apache Maven来管理。
有两种实现方式,
第一种类似项目中使用的,定义三个文件:
src/main/resources/config_DEV.properties
src/main/resources/config_TEST.properties
src/main/resources/config_PROD.properties
项目中实际引用的是config.properties,通过maven-antrun-plugin来实现替换
(ps:config.properties 文件不需要提前创建,编译时自动copy)
第二种方式利用了maven的profile和filtering的功能,把上述步骤的直接替换改为过滤器来进行选择。缺点是,如果在其它配置文件中引用变量还可以,如果在java文件中读取需要指定文件名时还需要额外做判断,不灵活。
配置文件引用: <bean id="uploadService" class="com.oist.project.service.UploadServiceImpl"> <property name="uploadDir" value="${spring.uploadDir}"/> </bean>
原理可参考链接:
http://archboy.org/2012/05/21/apache-maven-profile-filtering-multiple-build-environments/
具体实现最好参考:
http://blog.csdn.net/wangjunjun2008/article/details/11516323
http://blog.csdn.net/wuxinzaiyu/article/details/8524274
http://blog.csdn.net/crazycoder2010/article/details/7264644
- <build>
- <filters>
- <filter>src/main/resources/config_${env}.properties</filter> //要过滤的文件路径、名称
- </filters>
- <resources>
- <resource>
- <directory>src/main/resources</directory> //这个路径下的文件打开过滤
- <filtering>true</filtering>
- </resource>
- </resources>
- ......
- </build>
这种方式需要提前创建好config.properties文件,且文件内容格式为:
jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
编译后,占位符中内容将会被替换为实际值
省事的方式是直接将属性定义在profile里,其它地方直接引用,变量多时比较臃肿,不建议
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<redis.hostName>cache01.game.sogou-inc.com</redis.hostName>
<redis.port>6380</redis.port>
<jdbc.driver>com.p6spy.engine.spy.P6SpyDriver</jdbc.driver>
<!--<jdbc.driver>com.mysql.jdbc.Driver</jdbc.driver>-->
<logback.logLevel>debug</logback.logLevel>
<static.resource>http://localhost</static.resource>
<ime.push.online>false</ime.push.online>
</properties>
</profile>
在编译项目时,可以使用 -P 参数指定需要使用的 profile 的 id,比如下面命令将会使用 dev profile:
$mvn clean compile -Pdev 假如不指定 -P 参数的话,则会使用 activeByDefault=true 的一项
如果代码中需要判断当前环境,一般通过获取本机ip地址做判断
还有第三种方式更简单,利用resin properties重写的功能,避免环境依赖,开发机、测试机、预发布机、线上机容器中分别配置对应的属性。
<context:property-placeholder order="0" location="classpath:app.properties" system-properties-mode="OVERRIDE"/>
在resin配置文件/usr/local/resin/conf/resin.xml 中去配置app.properties中的参数
<!-- Java system-properties -->
<system-property mail.smtp.host="127.0.0.1"/>
<system-property mail.smtp.port="25"/>
<system-property spring.profiles.active="production"/>
<system-property domain="api.app.wan.sogou.com"/>
<system-property peak.api_server="http://up.sohu.com"/>
<system-property peak.pub_server="https://up.sohu.com"/>
<system-property peak.game_center_callback="http://api.app.wan.sogou.com/api/peak.do"/>
<system-property midas.api_host="api.unipay.qq.com"/>
<system-property db.game.host="mblgm01.dt.mysql.db"/>
<system-property db.game.user="shouyou"/>
<system-property db.game.password="shouyou!@#$"/>
<system-property memcached.servers="10.11.211.101:11211"/>
<system-property redis.host="redis01.shouyou.tc.vm"/>
<system-property redis.port="6379"/>
外部配置
有时候有些关键的属性,比如数据库密码,需要放在xml文件之外,便于后续修改。Spring解决这个问题的方法有两种,一种是属性占位符,一种是属性重写。另外阿里提供的AutoConfig有更好的配置管理机制,将在后面详细介绍。
第一种:关于占位符,首先载入属性文件:
- <context:property-placeholder location="classpath:/db.properties"/>
- 或者
- <context:property-placeholder location="file:///etc/db.properties"/>
引用属性中的变量:
- <bean id="dataSource" class="org.springframework.jdbc.datbase.DriverManagerDataSource">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}/>
- </bean>
第二种:
(1)覆盖properties文件中的变量:
- <util:properties id="defConf>
- <prop key="jdbc.url">jdbc:mysql://localhost/test</prop>
- <prop key="jdbc.driverClassName">com.mysql.jdbc.Driver</prop>
- </util:properties>
- <context:property-placeholder location="classpath:/db.properties" properties-ref="defConf"
- system-properties-mode="OVERRIDE"/>
- 除了OVERRIDE还有FALLBACK、NEVER。
这个就是上面的例子,通过resin配置文件修改了system properties。
(2) 覆盖xml配置。载入properties文件并覆盖现有的xml配置。请看下面的例子:
- <bean id="dataSource" class="xxx">
- <property name="url">jdbc:oracle://xxx</property>
- <property name="username">xxx</property>
- </bean>
- <context:property-overrider location="classpath:/db.properties"/>
这个用另一个文件替换了原来的文件
System Properties
In Properties, we examined the way an application can use Properties
objects to maintain its configuration. The Java platform itself uses a Properties
object to maintain its own configuration. The System
class maintains a Properties
object that describes the configuration of the current working environment. System properties include information about the current user, the current version of the Java runtime, and the character used to separate components of a file path name.
The following table describes some of the most important system properties
|
|
"java.class.path" |
Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the path.separator property. |
"java.home" |
Installation directory for Java Runtime Environment (JRE) |
Resin 中
<system-property>
Sets a Java system property. The effect is the same as if you had called before starting Resin.
<resin> <system-property foo="bar"/> </resin>
相关推荐
总结来说,Maven Profile是Maven的核心特性之一,它使得我们能够在单个项目中管理多环境的构建配置。通过定义和激活不同的Profile,我们可以灵活地控制项目的依赖、插件和资源,从而实现高效、便捷的多环境构建。...
通常,开发者会创建多个Maven配置文件(profiles),每个文件对应一个特定的环境,然后通过filtering功能过滤资源文件中的变量,实现环境间配置的切换。 【标签】:“源码 工具” “源码”标签暗示了讨论可能涉及...
通过灵活运用这些策略,开发者可以轻松地管理不同环境的配置,提高工作效率,同时确保代码在各个环境下的正确性和一致性。在实际项目中,可能需要结合使用多种方法,以达到最佳的配置效果。 在提供的压缩包中,`pom...
本篇文章将深入探讨"Maven2资源和配置下载"的主题,以及如何在MyEclipse环境中搭建私有仓库(私服)来管理和分发Maven文件。 首先,Maven2是Apache软件基金会开发的一款构建工具,它通过XML格式的POM(Project ...
Nexus 是一款用于管理项目依赖库的工具,它可以作为Maven仓库服务器,帮助开发者管理第三方库、项目构建产物等资源,并支持多种类型仓库的配置。 **3. Jenkins (原Hudson)** Jenkins 是一个开源的持续集成工具,它...
Maven是Java开发中的一款重要构建工具,它管理项目的依赖、构建流程、版本和资源,极大地提高了开发效率。本文将深入探讨Maven配置文件及其在Java项目中的应用。 首先,Maven的核心配置文件是`settings.xml`,这个...
【Maven环境搭建与项目创建】 Maven是一个强大的Java项目管理工具,它帮助开发者管理和构建项目,通过统一的构建过程和依赖管理。在Maven环境中,`Groupid`表示项目的包名,通常按照公司域名反写的方式组织,例如`...
profiles允许在不同的环境(如开发、测试、生产)下使用不同的配置。例如,可以设置不同的数据库连接参数,或者在部署时启用或禁用某些插件。 10. **Maven的命令行参数** Maven支持多种命令行参数,如`-...
要使用 Maven,需要先下载和安装 Maven,然后配置环境变量。Maven 的下载地址是 apache.org,用户可以根据自己的操作系统选择适合的安装包。安装完成后,需要配置环境变量,例如将 Maven 的安装目录添加到 PATH 变量...
总结来说,"maven 过滤文件夹打包"是利用Maven的资源过滤和插件配置功能,确保在不同环境下打包的项目包含正确的配置文件。这一方法提高了开发效率,降低了手动管理配置文件的出错概率,是Java项目部署中常见且重要...
总结来说,Maven的Profile功能是实现多环境构建的关键,通过它我们可以方便地管理不同环境的配置,构建出适应各种环境的Java应用部署包。同时,配合标准的目录结构(如WEB-INF和META-INF),我们可以更好地组织和...
根据给定文件的信息,本文将围绕Maven的下载、安装、配置及使用教程进行详细介绍,并对部分提及的相关项目和环境配置进行简要说明。 ### Maven简介 Maven是一款由Apache组织开发的自动化构建工具,主要用于Java...
【Maven很Maven仓库】这个标题暗示了讨论的核心是关于Maven以及它与Maven仓库的关系。Maven是一个在Java开发中广泛...通过分享配置好的Maven仓库资源,社区可以有效地减少开发者的重复劳动,促进知识的传播和项目协作。
标题中的“maven资源安装包”指的是一个包含Maven完整环境的压缩文件,它通常包含了Maven的执行文件、配置文件以及必要的库文件,使得用户能够快速地在本地环境中搭建并使用Maven。 Maven的核心概念是项目对象模型...
为了提高测试效率,Maven提供了多种配置选项。例如,通过设置maven-surefire-plugin的excludes和includes属性,我们可以控制哪些测试类应该被运行。此外,还可以使用profiles来为不同的环境定义不同的测试策略。在...
Apache Maven 是一个强大的Java项目管理和综合工具,它简化了构建过程,通过标准化构建生命周期和依赖管理,使得开发者能够更高效地构建、测试和部署Java应用程序。Maven 3.3.9是Maven的一个稳定版本,它包含了多个...
### Maven资源管理与Java项目配置详解 #### 一、Maven简介 Apache Maven 是一个流行的项目管理和理解工具,主要用于Java项目的构建、依赖管理和项目信息管理。通过Maven,开发者能够轻松地管理项目的生命周期,...