使用Maven开发Java项目

来源:互联网 发布:中南大学网络教育答案 编辑:程序博客网 时间:2024/05/01 16:41

其实使用maven已经很久了,从早期的1.0.1到现在的2.0.6,其实对于一般项目开发,常用的也就是创建项目(Create)、构建(Build)、测试(Test)、发布(Release)。本文并不是关于maven如何使用的详细介绍,而只是在实际项目开发中的一些常用活动以及相关插件的使用总结,如果你对于maven尚不了解,可以先在官方网站[Maven'site]逛逛,如果你想进一步学习,可以到这里[Maven: The Definitive Guide]。这里所说的maven是指2.x版本,如果你正在使用的是1.x,请参考《Maven: A Developer's Notebook》。但是推荐使用2.0,至于详细的特性比较,可以参考[MAVEN Feature Comparisons]。

1) 创建项目
首先,你得为你的项目起一个响亮一点的名字,既能体现项目的意义,又非常好记。我比较喜欢用花和动物的名字来命名,也可以是某个地名或人名。这里假设为rose,火红的玫瑰。下面的命令,将会创建一个项目的代码框架。其中groupId和artifactId,可以根据实际需要来命名。

mvn archetype:create /
   -DarchetypeGroupId=org.apache.maven.archetypes /
   -DgroupId=com.rainboyan.rose /
   -DartifactId=rose

运行成功后,将会创建目录如下:

rose
|-- pom.xml
`-- src
     |-- main
     |    `-- java
     |        `-- com
     |            `-- rainboyan
     |                `-- rose
     |                    `-- App.java
     `-- test
         `-- java
             `-- com
                 `-- rainboyan
                     `-- rose
                         `-- AppTest.java

打开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.rainboyan.app</groupId>    <artifactId>rose</artifactId>    <packaging>jar</packaging>    <version>1.0-SNAPSHOT</version>    <name>rose</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> </project>
虽然还没开始写任何代码,但是别急,应该首先来检查一下是否可用。我们开始测试一下,键入mvn compile编译项目,mvn test运行测试,mvn package项目打包,如果不出意外的话,将会BUILD SUCCESSFUL。显然这还不是我们想要的,对于Web应用来说,我们需要打包成war或者ear。

2) 构建
添加build
<build>          <defaultGoal>package</defaultGoal>          <finalName>${artifactId}-${version}</finalName>          <resources>              <resource>                  <directory>src/main/resources</directory>              </resource>              <resource>                  <directory>src/main/java</directory>                  <includes>                    <include>**/*.xml</include>             <include>**/*.properties</include>                  </includes>              </resource>          </resources>          <testResources>              <testResource>                  <directory>src/test/resources</directory>              </testResource>          </testResources> </build>
如果你使用的JDK是1.5以上版本,可以修改编译插件的设置。

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
         <source>1.5</source>
         <target>1.5</target>
     </configuration>
</plugin>

作为一个项目开发,依赖第三方库是少不了的,尤其是借助第三方开源软件,而这也正是maven强大的功能之一,就是依赖管理。你只需要设置所需第三方jar的名称和版本即可,maven会自动下载到本地,你也可以建立自己的仓库(rspository),这在小组开发中,是非常有必要的。此外,随着项目的进一步开发,依赖库可以很方便的升级,而不用像以前那样手动替换并且还提心吊胆。
下面就是添加依赖库:

<dependencies>
   <!-- test framework -->
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.2</version>
     <scope>test</scope>
   </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.4</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jsp-api</artifactId>
     <version>2.0</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.1.2</version>
   </dependency>    
</dependencies>

Maven有很多Respository站点:如ibiblio.org和sunsite.dk等。

3) 测试
项目建立起来后,就可以编码了,但是依照测试驱动开发的原则(TDD),我们应该先编写测试案例,接着运行测试,编写代码,再测试,再编码,直到完成一个小的迭代。使用maven来运行测试非常简单。一个mvn test就搞定。这样会运行所有的测试案例,如果你只想运行其中一个或几个类,你可以过滤要测试的类,除了配置外,简单一些就直接设置属性test。如下所示:

       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
           <configuration>
               <excludes>
                   <exclude>**/TestCircle.java</exclude>
                   <exclude>**/TestSquare.java</exclude>
               </excludes>
           </configuration>
       </plugin>

直接-D设置需要测试的类名

mvn test -Dtest=UserTest
或者
mvn test -Dtest=User*

4) 版本控制
对于一个项目开发来说,没有一个版本控制工具,就像软件没有UNDO一样,尤其在一个团队中,没有版本控制,将会变得混乱不堪,每个成员变得畏首畏尾,小心翼翼。对于版本控制软件,你可以选择VSS、CVS、Subversion。目前大部分开源项目都已经从CVS迁移到Subersion了,从相应的工具和文档手册,都应有尽有,使用非常方便。我选择的是Subversion,自己搭建个Subversion服务器。有兴趣的可以参考我以前的文章。这里假定你已经安装了Subersion客户端。
首先要配置pom.xml,说明代码存放的位置。[snvhost]应该是实际的svn主机地址。

   <scm>
     <connection>
       scm:svn:http://[snvhost]/rose/trunk</connection>
     <developerConnection>
       scm:svn:http://[snvhost]/repos/rose/trunks</developerConnection>
     <url>http://[snvhost]/rose/trunk</url>
   </scm>

接着,进入工作目录,签出源代码。

svn co   http://[snvhost]/rose/trunk rose

在实际工作中,你也可以使用一些IDE插件,如Subeclipse(eclipse的Subversion插件),或者TortoiseSVN(Subversion的客户端)。
maven提供了scm的插件来进行操作,目前该插件支持的版本控制工具有:

  • Bazaar
  • CVS
  • Mercurial
  • Perforce
  • StarTeam
  • Subversion
  • CM Synergy
  • ClearCase
  • File system
  • Visual Source Safe
    支持的SCM命令有:
  • Changelog
  • Checkin
  • Checkout
  • Diff
  • Edit
  • Status
  • Tag
  • UnEdit
  • Update
  • Validate
    常用的命令有,mvn scm:update和mvn scm:diff。
    5) 报告
    目前maven支持的reporting主要有changelog,changes,checkstyle,clover,doap,docck,javadoc,jxr,pmd,project-info-reports,surefire-report。其中常有的checkstyle,pmd是用来代码检查的(主要是静态检查),clover是用来生成代码测试覆盖率报告的。javadoc是生成doc文档。如果想生成报告,则需要添加相应的reporting配置。具体如下:

    <reporting>
       <plugins>
         <plugin>
           <artifactId>maven-changes-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-checkstyle-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-javadoc-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-jxr-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-pmd-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-surefire-report-plugin</artifactId>
         </plugin>
         <plugin>
           <artifactId>maven-javadoc-plugin</artifactId>
           <configuration>
             <links>
               <link>http://java.sun.com/j2ee/1.5/docs/api</link>
             </links>
           </configuration>
         </plugin>
       </plugins>
    </reporting>

    你可以用站点命令来生成所有的报告,也可以只生成指定的报告。

    mvn site

    mvn checkstyle:checkstyle

    6) 发布
    项目开发到一定阶段,就需要发布某个版本,可以是source或者binary,也可以是docs,jars等。maven提供了assembly插件来完成这项工作。发布的文件格式支持zip,tar.gz,tar.bz2,jar,dir,war等等。
    1) binary发布,你需要在src/assemble目录下创建bin.xml配置文件,用来说明需要包含哪些文件。文件内容大致如下:

    <assembly>
       <id>bin</id>
       <formats>
         <format>tar.gz</format>
         <format>tar.bz2</format>
         <format>zip</format>
       </formats>
       <includeBaseDirectory>false</includeBaseDirectory>
       <fileSets>
         <fileSet>
           <outputDirectory>${artifactId}-${version}</outputDirectory>
           <includes>
             <include>README*</include>
             <include>LICENSE*</include>
             <include>NOTICE*</include>
             <include>CHANGLOG*</include>
           </includes>
         </fileSet>
         <fileSet>
           <outputDirectory>${artifactId}-${version}</outputDirectory>
           <directory>target</directory>
           <includes>
             <include>*.war</include>
           </includes>
         </fileSet>
       </fileSets>
    </assembly>

    2) source发布,用来发布源码。你同样需要在src/assemble目录下创建src.xml配置文件,文件内容大致如下:

    <assembly>
       <id>src</id>
       <formats>
         <format>tar.gz</format>
         <format>tar.bz2</format>
         <format>zip</format>
       </formats>
       <includeBaseDirectory>false</includeBaseDirectory>
       <fileSets>
         <fileSet>
           <outputDirectory>${artifactId}</outputDirectory>
         <directory>/</directory>
         <excludes>
             <exclude>**/target/**</exclude>
           </excludes>
         </fileSet>  
       </fileSets>
    </assembly>

    当然,在最后,你得告诉maven该插件的配置文件存放的位置,因此需要在pom.xml中这样写。

    <plugin>
       <artifactId>maven-assembly-plugin</artifactId>
       <configuration>
         <finalName>${project.artifactId}-${project.version}</finalName>
         <descriptors>
           <descriptor>src/assemble/src.xml</descriptor>
           <descriptor>src/assemble/bin.xml</descriptor>
         </descriptors>
       </configuration>
    </plugin>