- 浏览: 1073724 次
- 性别:
- 来自: 南京
-
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
1. 前言
有时候我们开发的软件有不同的环境,开发阶段是开发环境,也就是我们这些研发人员平时使用的环境,大多数人开发还是在Windows下面吧,少数人连开发环境都需要在Linux或者Unix下进行,因为Java自身的跨平台性可能在哪个操作系统下开发差别不大,如果Java调用C/C++执行特定服务,就需要C/C++人员开发时最好和生产环境一样在Linux(而且版本一致)下进行研发,省得到时候测试的时候还得放到Linux下重新编译一遍。开发到了一定阶段后往往就是测试那边Team的加入了,功能测试、压力测试等等需要一套测试环境,而往往测试环境也分很多种情况,功能测试环境比较接近于开发环境,而压力测试环境往往接近于生产环境,甚至就是生产环境。面对这么多环境,以前我们可能都是手工进行配置,在不同环境下赋予不同的配置值。而手工配置就面临着可能出现错误,效率比较低等问题。
使用Maven的Profile配置,可以帮助我们灵活的进行构建项目,使之通过统一的定制化pom.xml配置就能让它适应不同的环境,如此一来显得软件更有应变性和适应性。
2. 屏蔽构建差异
笔者就以之前那个持久层模块作为基础,假如数据库在开发环境和测试环境有差异,怎么办,一般我们将数据库信息写到了配置文件properties中。
db.properties内容如下
大家有可能奇怪,这里应该是具体的配置值了,是啊,配置值在pom.xml中
pom.xml片段如下
红色配置部分代表过滤资源配置文件,所有的资源文件在执行Maven构建命令时,pom中种种信息都和配置文件中的内容息息相关,需要让配置文件感应到pom内容。
蓝色部分就是定制化的prifile属性信息,其中配置了2个个性化配置信息。test1和test2。activation标签代表激活该特性的配置,这里所谓激活,其实就是让该个性化配置生效的意思。
下面我们写一个Java类简单读取配置文件
之后为其写单元测试
代码很简单,下面我们在控制台输入如下命令看看
Java代码
1.mvn clean package –Ptest2
mvn clean package –Ptest2 控制台输出结果如下
Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.com.mysql.jdbc.Driver
6.jdbc:mysql://192.168.1.109:3306/uxian99
7.dba
8.dba
9.dba
10.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec
11.
12.Results :
13.
14.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
com.mysql.jdbc.Driver
jdbc:mysql://192.168.1.109:3306/uxian99
dba
dba
dba
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 可以看到单元测试用例结果是test2的配置信息,而构建后的配置文件内容如下db.properties
Java代码
1.db.Driver=com.mysql.jdbc.Driver
2.db.url=jdbc:mysql://192.168.1.109:3306/uxian99
3.db.user=dba
4.db.password=dba
db.Driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.109:3306/uxian99
db.user=dba
db.password=dba 可以看到,构建后的配置文件内容不再是${db.Driver}这种临时变量信息,而是被pom文件替换后的实际配置值。
不更改任何代码,在控制台输入如下
Java代码
1.mvn clean package -Denv=dev1
mvn clean package -Denv=dev1 结果如下表示profile的test1特性被激活了,测试结果与预期预料不符合。激活profile有以上两种方式,显示指定配置参数方式、系统属性=某些具体值的时候。还有在用户级setting.xml或者全局级setting.xml文件中配置默认信息的。不过这种方式不是很赞成。因为配置了此信息意味着只能在自己本机环境中得到正确的相应,项目打包,发布后并不会保存到自身的pom文件中,那么别人构建的时候也许会报错。所以尽量在项目级别的pom.xml中配置相关定制化信息。
Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.org.gjt.mm.mysql.Driver
6.jdbc:mysql://localhost:3306/uxian99
7.liuyan
8.111111
9.111111
10.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
11.ILURE!
12.
13.Results :
14.
15.Failed tests:
16. testGenerateText(util.ReadConfigTest)
17.
18.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
org.gjt.mm.mysql.Driver
jdbc:mysql://localhost:3306/uxian99
liuyan
111111
111111
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
ILURE!
Results :
Failed tests:
testGenerateText(util.ReadConfigTest)
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
3. 总结
Profile是轮廓;外形;外观;形象; 侧面(像),侧影的意思,我觉得叫做个性化配置更好。个性化配置还可以过滤web项目资源、集成测试。因为网上有相关的资源,就不总结了。多数应用还是屏蔽个性化构建的差异。
【转载地址】http://suhuanzheng7784877.iteye.com/blog/1100412
有时候我们开发的软件有不同的环境,开发阶段是开发环境,也就是我们这些研发人员平时使用的环境,大多数人开发还是在Windows下面吧,少数人连开发环境都需要在Linux或者Unix下进行,因为Java自身的跨平台性可能在哪个操作系统下开发差别不大,如果Java调用C/C++执行特定服务,就需要C/C++人员开发时最好和生产环境一样在Linux(而且版本一致)下进行研发,省得到时候测试的时候还得放到Linux下重新编译一遍。开发到了一定阶段后往往就是测试那边Team的加入了,功能测试、压力测试等等需要一套测试环境,而往往测试环境也分很多种情况,功能测试环境比较接近于开发环境,而压力测试环境往往接近于生产环境,甚至就是生产环境。面对这么多环境,以前我们可能都是手工进行配置,在不同环境下赋予不同的配置值。而手工配置就面临着可能出现错误,效率比较低等问题。
使用Maven的Profile配置,可以帮助我们灵活的进行构建项目,使之通过统一的定制化pom.xml配置就能让它适应不同的环境,如此一来显得软件更有应变性和适应性。
2. 屏蔽构建差异
笔者就以之前那个持久层模块作为基础,假如数据库在开发环境和测试环境有差异,怎么办,一般我们将数据库信息写到了配置文件properties中。
db.properties内容如下
1.db.Driver=${db.Driver} 2.db.url=${db.url} 3.db.user=${db.user} 4.db.password=${db.password}
大家有可能奇怪,这里应该是具体的配置值了,是啊,配置值在pom.xml中
pom.xml片段如下
1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3. <modelVersion>4.0.0</modelVersion> 4. <artifactId>MavenAccount-persist</artifactId> 5. <packaging>jar</packaging> 6. <name>MavenAccount-persist</name> 7. 8. <parent> 9. <groupId>com.liuyan.account</groupId> 10. <artifactId>MavenAccount-aggregator</artifactId> 11. <version>0.0.1-SNAPSHOT</version> 12. <relativePath>../MavenAccount-aggregator/pom.xml</relativePath> 13. </parent> 14. 15. <dependencies> 16. ………………省略依赖 17. </dependencies> 18. 19. <build> 20. <resources> 21. <resource> 22. <directory>${project.basedir}/src/main/resource</directory> 23. <filtering>true</filtering> 24. </resource> 25. </resources> 26. </build> 27. 28. <profiles> 29. <profile> 30. <id>test1</id> 31. <activation> 32. <property> 33. <name>env</name> 34. <value>dev1</value> 35. </property> 36. </activation> 37. <properties> 38. <db.Driver>org.gjt.mm.mysql.Driver</db.Driver> 39. <db.url>jdbc:mysql://localhost:3306/uxian99</db.url> 40. <db.user>liuyan</db.user> 41. <db.password>111111</db.password> 42. </properties> 43. </profile> 44. <profile> 45. <id>test2</id> 46. <activation> 47. <property> 48. <name>env</name> 49. <value>dev2</value> 50. </property> 51. </activation> 52. <properties> 53. <db.Driver>com.mysql.jdbc.Driver</db.Driver> 54. <db.url>jdbc:mysql://192.168.1.109:3306/uxian99</db.url> 55. <db.user>dba</db.user> 56. <db.password>dba</db.password> 57. </properties> 58. </profile> 59. </profiles> 60.</project>
红色配置部分代表过滤资源配置文件,所有的资源文件在执行Maven构建命令时,pom中种种信息都和配置文件中的内容息息相关,需要让配置文件感应到pom内容。
蓝色部分就是定制化的prifile属性信息,其中配置了2个个性化配置信息。test1和test2。activation标签代表激活该特性的配置,这里所谓激活,其实就是让该个性化配置生效的意思。
下面我们写一个Java类简单读取配置文件
1.package util; 2. 3.import java.io.IOException; 4.import java.io.InputStream; 5.import java.util.Properties; 6. 7.public class ReadConfig { 8. 9. public static String read() throws IOException { 10. InputStream in = ClassLoader.getSystemResourceAsStream("db.properties"); 11. Properties p = new Properties(); 12. p.load(in); 13. String dbDriver = (String) p.get("db.Driver"); 14. String dburl = (String) p.get("db.url"); 15. String dbuser = (String) p.get("db.user"); 16. String dbpassword = (String) p.get("db.password"); 17. 18. System.out.println(dbDriver); 19. System.out.println(dburl); 20. System.out.println(dbuser); 21. System.out.println(dbpassword); 22. return dbpassword; 23. 24. } 25. 26.}
之后为其写单元测试
1.package util; 2. 3.import static org.junit.Assert.assertTrue; 4. 5.import java.io.IOException; 6. 7.import org.junit.Test; 8. 9.public class ReadConfigTest { 10. 11. @Test 12. public void testGenerateText() throws IOException { 13. String password = ReadConfig.read(); 14. System.out.println(password); 15. assertTrue(password.equals("dba")); 16. } 17. 18.}
代码很简单,下面我们在控制台输入如下命令看看
Java代码
1.mvn clean package –Ptest2
mvn clean package –Ptest2 控制台输出结果如下
Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.com.mysql.jdbc.Driver
6.jdbc:mysql://192.168.1.109:3306/uxian99
7.dba
8.dba
9.dba
10.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec
11.
12.Results :
13.
14.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
com.mysql.jdbc.Driver
jdbc:mysql://192.168.1.109:3306/uxian99
dba
dba
dba
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 可以看到单元测试用例结果是test2的配置信息,而构建后的配置文件内容如下db.properties
Java代码
1.db.Driver=com.mysql.jdbc.Driver
2.db.url=jdbc:mysql://192.168.1.109:3306/uxian99
3.db.user=dba
4.db.password=dba
db.Driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.109:3306/uxian99
db.user=dba
db.password=dba 可以看到,构建后的配置文件内容不再是${db.Driver}这种临时变量信息,而是被pom文件替换后的实际配置值。
不更改任何代码,在控制台输入如下
Java代码
1.mvn clean package -Denv=dev1
mvn clean package -Denv=dev1 结果如下表示profile的test1特性被激活了,测试结果与预期预料不符合。激活profile有以上两种方式,显示指定配置参数方式、系统属性=某些具体值的时候。还有在用户级setting.xml或者全局级setting.xml文件中配置默认信息的。不过这种方式不是很赞成。因为配置了此信息意味着只能在自己本机环境中得到正确的相应,项目打包,发布后并不会保存到自身的pom文件中,那么别人构建的时候也许会报错。所以尽量在项目级别的pom.xml中配置相关定制化信息。
Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.org.gjt.mm.mysql.Driver
6.jdbc:mysql://localhost:3306/uxian99
7.liuyan
8.111111
9.111111
10.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
11.ILURE!
12.
13.Results :
14.
15.Failed tests:
16. testGenerateText(util.ReadConfigTest)
17.
18.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
org.gjt.mm.mysql.Driver
jdbc:mysql://localhost:3306/uxian99
liuyan
111111
111111
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
ILURE!
Results :
Failed tests:
testGenerateText(util.ReadConfigTest)
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
3. 总结
Profile是轮廓;外形;外观;形象; 侧面(像),侧影的意思,我觉得叫做个性化配置更好。个性化配置还可以过滤web项目资源、集成测试。因为网上有相关的资源,就不总结了。多数应用还是屏蔽个性化构建的差异。
【转载地址】http://suhuanzheng7784877.iteye.com/blog/1100412
发表评论
-
maven 获取jar从不同的仓库搜寻排序
2014-01-08 14:48 1533maven仓库读取备忘录: 在setting.xml配置了镜 ... -
Tomcat-maven-plugin插件使用
2014-01-03 14:50 2523maven-tomcat-plugin让maven与tomca ... -
制作maven archetype方法
2013-09-09 00:38 5928一直想生成一个archetype,节省初始化项目时间,时间让各 ... -
创建简单的maven archetype
2013-09-09 00:32 882如果你想定义一个maven工程模板,有一种很快的方法: 1.定 ... -
使用assembly plugin实现自定义打包
2013-09-08 23:56 587在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
maven相关
2013-09-08 11:32 8241、Maven内置变量说明: ${basedir} ... -
Maven 打包 jar 、war 文件时,不将 pom.xml 等打包进包中
2013-09-08 11:29 3231如果是 jar 包,在 Plugin 中配置 <buil ... -
maven super pom 文件位置
2013-09-05 16:00 1577D:\apache-maven-3.0.4\lib 下的 ma ... -
Maven profile filter
2013-09-05 15:03 2172使用maven的profile和filter插件管理配置项 ... -
maven资源文件引用
2013-08-27 00:07 1582资源文件引用: 1、maven默认系统的资源文件在src/m ... -
maven实现JS+CSS自动压缩
2013-08-26 22:02 10901. maven实现js+css自动压缩完整代码 <? ... -
maven 常用命令goal
2013-08-26 17:12 8331.显示一个插件所有的goal 2.创建一个基于模版的项目, ... -
maven 命令背后是如何工作的
2013-08-26 17:08 798Maven强大的一个重要的原因是它有一个十分完善的生命周期模型 ... -
maven war包插件
2013-08-23 14:38 0<plugins> <plug ... -
Maven 打包 jar 、war 文件时,不将 pom.xml 等打包进包中
2013-08-23 14:33 1380如果是 jar 包,在 Plugin 中配置 <bui ... -
使用maven打war包过程中对文件进行copy、rename(move)、delete操作
2013-08-23 14:29 14331、在pom中声明ant插件:maven-antrun-plu ... -
eclipse下实现maven项目在tomcat容器热部署方法
2013-08-23 14:27 24801、eclipse安装maven插件、svn插件 2、从sv ... -
maven-antrun-plugin(运行ant的插件)
2013-08-23 14:22 1141[转载声明] 转载时必须 ... -
Maven实战之antrun插件
2013-08-23 14:18 993在Maven实际使用过程中,有时候在对一些旧有的项目的做从Ma ... -
maven filter转换时容易忽略的错误
2013-04-18 11:48 2020使用Maven管理,定义了Filter,配置文件中的动态值都由 ...
相关推荐
在POM.xml中可以配置Maven插件,定制构建过程。例如,配置maven-javadoc-plugin生成API文档: ```xml <groupId>org.apache.maven.plugins <artifactId>maven-javadoc-plugin <version>3.3.0 <id>...
- **CI工具集成**:Maven可以很好地与Jenkins、GitLab CI/CD等工具集成,实现自动化构建和部署。 - **部署策略**:通过deploy插件将构建产物发布到远程仓库。 通过深入理解和熟练运用这些高级特性,开发者可以更...
3. **生命周期与构建阶段**:Maven有三个基本生命周期,分别是`clean`、`default`和`site`。`default`生命周期中最常用的阶段有`compile`(编译)、`test`(测试)、`package`(打包)、`install`(安装到本地仓库)...
Maven 提供了多种命令行选项来定制构建过程,如 `-DskipTests` 跳过测试,`-U` 强制更新所有依赖等。此外,还可以通过 POM 文件中的 profile 来定义不同环境的构建配置。 10. **集成开发环境(IDE)支持** Maven ...
- MavenProfile定制化构建:为不同的环境提供定制化的构建配置。 - 编写Maven插件:扩展Maven功能,可以通过开发插件满足特殊需求。 3. Maven环境的搭建 - 下载Maven:从Apache网站下载Maven安装包。 - Maven的版本...
springboot学习笔记 spring基础 Spring概述 Spring的简史 xml配置 注解配置 java配置 Spring概述 Spring的模块 核心容器CoreContainer Spring-Core Spring-Beans ...