目的:spring好久没有系统的学习了,借这个机会重新学习一下spring的思想同时换一种构建的思路。
maven2是一款更时髦的软件构建工具,功能类似于ant,但是它约定优于配置的理念、简洁的项目对象模型、解决包依赖的优势和其他良好的特性使其越来越流行。
默认情况下,maven2的资源包依赖于远程的互联网资源库以及本地的私有资源库,而在实际的开发中,大多数采用remote库--〉proxy库--〉local库三层结构,这样不但提高了构建的效率,也为团队开发提高了便利性。
因此我的demo会从以下几个方面展开:
1。maven2环境搭建
2。jpetstore结构整理
3。pom文件
前置约束:
maven2版本:2.2.0
nexus 版本:1.3.6
spring版本:2.5.6
一。maven2环境搭建
1。maven2.2.0下载安装
首先从apache网站上下载maven2,下载地址为http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.0-bin.zip 。下载完毕后将其解压缩至C:\tools\apache-maven-2.2.0\下面。
然后设置环境变量M2_HOME,指向C:\tools\apache-maven-2.2.0\,同时在path环境变量中追加%M2_HOME%/bin;
最后打开一个dos窗口,输入mvn -version,显示类似如下:
C:\Documents and Settings\shenge>mvn -version |
Apache Maven 2.2.0 (r788681; 2009-06-26 21:04:01+0800) Java version: 1.5.0_10 Java home: C:\tools\jdk15010\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
|
即表示安装成功。
很多公司都需要通过代理才能访问www,因此maven2要下载互联网资源包,需要设置代理。在maven2的全局配置文件C:\tools\apache-maven-2.2.0\conf\settings.xml设置
<proxies> <!-- proxy Specification for one proxy, to be used in connecting to the network.--> <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username></username> <password></password> <host>proxy.host.com</host> <port>port</port> <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts> </proxy> </proxies>
settings.xml分为全局设置和用户设置,在maven2安装目录下的就是全局设置,也可以将此文件拷贝到用户目录下面的.m2下面,即为用户设 置。在windows开发环境下,只用一个已经足够。在这个文件中同时可以设计镜像...,将在后面demo过程中进行部分介绍。
2。nexus1.3.6下载安装
首先从sonatype下载nexus,下载地址为http://nexus.sonatype.org/downloads/nexus-webapp-1.3.6-bundle.zip ,下载完毕后解压缩到目录C:\tools\nexus1.3.6\下面。
然后是启动nexus,nexus自带jetty容器,因此直接运行C:\tools\nexus1.3.6\bin\jsw\windows-x86-32\Nexus.bat即可。如下输出:
C:\tools\nexus1.3.6\bin\jsw\windows-x86-32>nexus |
jvm 1 | 2009-07-28 14:05:28 INFO - o.s.n.Nexus:default - Creating default proxied release repository template... jvm 1 | 2009-07-28 14:05:28 INFO - o.s.n.Nexus:default - Creating default proxied snapshot repository template... jvm 1 | 2009-07-28 14:05:28 INFO - o.s.n.Nexus:default - Creating default virtual repository template... jvm 1 | 2009-07-28 14:05:28 INFO - o.s.n.Nexus:default - Nexus Wor k Directory : C:\tools\nexus1.3.6\bin\jsw\windows-x86-32\..\..\..\..\sonatype-wo rk\nexus jvm 1 | 2009-07-28 14:05:28 INFO - o.s.n.Nexus:default - Started N exus (version 1.3.6 OSS) jvm 1 | 2009-07-28 14:05:29 INFO - o.s.j.w.PlexusConfi~ - SecurityM anager with role='org.sonatype.jsecurity.realms.PlexusSecurity' and roleHint='we b' found in Plexus. jvm 1 | 2 009-07-28 14:05:29 INFO - org.mortbay.log - Started S [email protected]:8081 |
访问http://localhost:8081/nexus,可以出现nexus界面,即代表启动成功。
接下来,登录,管理员用户名密码默认为admin/admin123,登录后即可以进行proxy库的设置。
最后,设置proxy库以及设置maven2使其从nexus检索资源包。在此,我让maven2检索所有的资源包都从nexus public repositories组获取。为了达到这个目的,需要在settings.xml中设置如下:
<settings> <mirrors> <mirror> <!--This sends everything else to /public --> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public</url> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <!--Enable snapshots for the built in central repo to direct --> <!--all requests to nexus via the mirror --> <repositories> <repository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <!--make the profile active all the time --> <activeProfile>nexus</activeProfile> </activeProfiles> </settings>
此时,maven2查找资源包,无论是自己查找还是在pom中另外定义了其他资源库位置,都会到这个组里面进行查找。这就导致,如果在pom中定义了其他的资 源库位置令资源包查找不到,解决的办法有两个,一个是为mirrorOf指定值,此时maven2会直接根据pom指定的资源包位置进行下载;一个是通过 nexus进行管理,将pom中指定的资源库通过nexus管理界面添加到public repositories组中。
当然,更标准的做法是所有的第三方jar都从一个中央资源库获取,本项目生成的包可以发布到另一个release的资源库位置。
注:通过nexus的wrapper.exe可以轻松的将nexus在windows环境下面包装成windows服务。
二。Jpetstore结构整理
maven2的开发环境准备好了,下面开始整理spring2.5.6自带的Jpetstore例子的目录结构以及依赖包的整理。maven2对于开发的目录结构的理念是约定优于配置,因此它的结构基本上固定的。
1。目录结构整理。
先看一下Jpetstore的原先结构和maven2改造后的目录结构的对比:
还有一步要在此特别说明一下,src下面的sqlmap相关vo影射xml文件需要连同目录结构一起放到main/resources/下面。
其实,本身spring自带的jpetstore目录就已经安排的非常好了,所以迁移到maven2也是非常方便。
2。依赖包整理。
Jpetstore依赖包列表如下:
包名称 | 包版本 | groupID | artifactID | version |
aspectjweaver.jar | 1.6.2 | org.aspectj | aspectjweaver | 1.6.2 |
axis.jar | 1.4 | org.apache | axis | 1.4 |
commons-beanutils.jar | 1.6 | org.apache.commons | beanutils | 1.6 |
commons-collections.jar | 3.2 | org.apache.commons | colleactions | 3.2 |
commons-dbcp.jar | 1.2.2 | org.apache.commons | dbcp | 1.2.2 |
commons-digester.jar | 1.6 | org.apache.commons | digester | 1.6 |
commons-discovery.jar | 0.2 | org.apache.commons | discovery | 0.2 |
commons-logging.jar | 1.1.1 | org.apache.commons | logging | 1.1.1 |
commons-pool.jar | 1.3 | org.apache.commons | pool | 1.3 |
commons-validator.jar | 1.1.4 | org.apache.commons | validator | 1.1.4 |
hessian-3.1.3.jar | 3.1.3 | com.caucho | hessian | 3.1.3 |
hsqldb.jar | private-2005/07/12-01:24:00 |
org.hsqldb | hsqldb | 1.0.1(自定) |
ibatis-2.3.4.726.jar | 2.3.4 build# 726 | com.ibatis | ibatis | 2.3.4 |
jaxrpc.jar | created-by:1.4.2_05-b04 | javax.xml | jaxrpc | 1.4.2 |
jstl.jar | 1.1.2 | javax.servlet | jstl | 1.1.2 |
saaj-api.jar | created-by:1.4.2_11-b06 | javax.xml | soap | 1.4.2 |
spring.jar | 2.5.6.SEC01 | org.springframework | core | 2.5.6 |
spring-webmvc.jar | 2.5.6.SEC01 | org.springframework | web | 2.5.6 |
standard.jar | 1.1.2 | org.apache.taglibs | standard | 1.1.2 |
struts.jar | 1.2.9 | org.apache | struts | 1.2.9 |
wsdl4j.jar | 1.5.1 | javax.wsdl | wsdl4j | 1.5.1 |
jpetstore.jar | org.springframework.samples | jpetstore | 1.0.0.1(自定) | |
servlet-api.jar | 2.4 | javax.servlet | servlet-api | 2.4 |
接下来就是在pom文件中增加对这些包的依赖。其实要改造一个已经存在的项目,要改造这些依赖包是一项繁琐的工作,为了确保项目的依赖包没有弄错版本,我的建议是暂时先将这些包手工安装到nexus代理库中,以保证下载的库是我们正在使用的。
因为这个demo里面使用的只是public repositories组资源库,所以可以通过如下步骤来添加我们自己的依赖包进nexus库。以上传hessian-3.1.3.jar为例:
在nexus 3rd party库中upload 我们的hessian-3.1.3.jar,GAV Definition选择GAV Parameters,Group填com.caucho,Artifact填hessian,Version填3.1.3,Packaging选择jar;然后在选择构建上传部分选择我们本地的jar文件上传即可。
其他的依赖包可以做相似的处理。
做这些的前提是3rd party资源库必须包含在public repositories组中。
但是jpetstore.jar是个例外,这个资源包是在项目的构建过程中产生的,同时又在构建war的时候依赖于这个jar包,所以这个jar是不需要预先安装到nexus中,而是在maven2的构建过程中自动安装的????。
上面的目录结构对比图中,maven2目录结构我是通过如下操作来生成的:
mvn archetype:create -DgroupId=com.springframework.samples -DartifactId=jpetstore -DarchetypeArtifactId=maven-archetype-webapp
同时根据maven2的目录约定增加了一些目录,然后将相应的原先jpetstore目录下的文件拷贝到新的maven2目录结构下面。
三。pom文件
这一部分我们主要围绕maven2的核心pom文件来看一下maven2的处理过程。
先看一下通过上面的命令生成出来的pom.xml的样子,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.springframework.samples</groupId> <artifactId>jpetstore</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>jpetstore Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>jpetstore</finalName> </build> </project>
首先,为这个pom增加jpetstore所需的包依赖。
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>beanutils</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>colleactions</artifactId> <version>3.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>dbcp</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>digester</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>discovery</artifactId> <version>0.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>pool</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>validator</artifactId> <version>1.1.4</version> </dependency> <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>com.ibatis</groupId> <artifactId>ibatis</artifactId> <version>2.3.4</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.4.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>soap</artifactId> <version>1.4.2</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.wsdl</groupId> <artifactId>wsdl4j</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache</groupId> <artifactId>struts</artifactId> <version>1.2.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>core</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>web</artifactId> <version>2.5.6</version> </dependency> </dependencies>
除了自身生成的jpetstore.jar,其他的依赖都已经建好。
其实,到此处,执行mvn package已经可以生成jpetstore.war了。只是现在编译后的class文件没有预先打包到jpetstore.jar文件中。
现在生成的war还不能放到容器中运行,需要修改一下jdbc.txt以及构建合适的数据库。
同时可以执行mvn install将war包安装到local库中,也可以执行mvn deploy安装到proxy库中,最酷的一点可以通过mvn site生成站点。当然现在的这个pom还缺少很多元素,以后可以慢慢补充。
如何通过先发布jpetstore.jar,然后构建我们的war???暂时我也没找到及决方案,先放这儿吧。
Maven2还有很多其他好玩的东西,在接下来的时间,我会慢慢基于jpetstore项目进行一项项的研究,最终的目标是利用maven2+teamcity+svn整合一个良好的可运转的持续集成环境。
maven2已经提供很多插件plugin,可以参考http://maven.apache.org/plugins/index.html