使用Maven开发Java项目

其实使用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,文件内容如下: 虽然还没开始写任何代码,但是别急,应该首先来检查一下是否可用。我们开始测试一下,键入mvn compile编译项目,mvn test运行测试,mvn package项目打包,如果不出意外的话,将会BUILD SUCCESSFUL。显然这还不是我们想要的,对于Web应用来说,我们需要打包成war或者ear。

2) 构建

添加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.orgsunsite.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主要有changelogchangescheckstylecloverdoapdocckjavadocjxrpmdproject-info-reportssurefire-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>

    7) Ant集成

    <未完待续>

    8) 多模块开发

    <未完待续>

    9) J2EE应用开发

    <未完待续> 分享家:Addthis中国

  • Leave a Reply





    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。