使用maven2管理spring2.5项目(基于Jpetstore Demo)

目的: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

 

你可能感兴趣的:(apache,maven,ibatis,配置管理,项目管理)