[7.14实习笔记] Maven入门

今天主要学习了Maven。整理记录一下。

Maven 是 Java 项目的一个构建工具,阿里内部使用Maven 2.2.1作为项目构建工具。

【Tips】关于Maven和后面WebX的学习,建议参照WebX提供的样例petstore进行对照理解。petstore的Github仓库地址为:https://github.com/webx/citrus-sample/tree/master/petstore

安装配置

安装

安装过程在上一篇博客中已经写过了:

[7.11实习笔记] 环境搭建 JDK+IDEA+MAVEN+JBOSS+HSF+SVN

配置

首先,我们要介绍一下仓库的概念。

在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,如果你使用版本管理工具,如SVN,你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二进制文件方面并不出色。

Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标(坐标的概念将在下面提到),该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不再需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。

简言之,Maven仓库能帮助我们管理构件(主要是JAR)。

Maven的仓库分为本地仓库远程仓库。运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

关于仓库的 详细介绍,可参见:http://juvenshun.iteye.com/blog/359256

为什么要谈到这个概念呢?因为它是Maven的配置文件settings.xml的很重要的一部分。这个配置文件一般存在在两个地方,分别是用户目录下的.m2目录里,以及maven安装目录的conf目录中。

打开这个配置文件,我们主要关注下面几项内容:

<localrepository>:这一项指定了本地仓库的存储目录。

<mirrors>:这一项指定了远程仓库的镜像地址。如果你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用这项配置。

<profiles>:profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如windows下是一套信息,linux下又是另外一套信息,等等。关于profile的具体使用可参见:http://haohaoxuexi.iteye.com/blog/1900568

IntelliJ IDEA中配置Maven

在IntelliJ IDEA中使用Maven,可以在File→Settings→Project Settings→Maven中进行设置。

其中可以在Runner项下设置vm options: -Xmx512m -XX:MaxPermSize=1024m

项目结构

Maven的项目使用一个统一的约定的标准目录结构(Standard Directory Layout)。如下所示:

my-app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

这是一个典型的项目目录结构。

目录结构最顶层,是一个POM文件pom.xml(关于POM会在下面详细讲)。另外也可以有README.txt,LICENSE.txt等说明性文本。

子目录只有两种,src和target。其中target主要是存储build出来的东西的,src是存储所有的源代码的。它可以有这几种子目录:main(存放主要的构建代码);test(存放单元测试代码和资源),site,等。

在存储源代码的目录下(main,test等),有java(存放java代码),webapp(存放网络应用程序代码)和resource(存放资源)等目录。

src/main/java 应用程序/库的源代码
src/main/resources 应用程序/库的资源
src/main/filters 资源过滤文件
src/main/config 配置文件
src/main/scripts 应用程序/库的脚本
src/main/webapp 网络应用程序源代码
src/test/java 测试源代码
src/test/resources 测试资源
src/test/filters 测试资源过滤文件
src/it 集成测试(主要用于插件)
src/assembly 装配说明
src/site 站点
LICENSE.txt 项目许可协议
NOTICE.txt 项目所依赖的库所要求的说明和权限
README.txt 项目自述文件

POM

现在进入了Maven很重要的一个概念:POM(Project Object Model)。POM是Maven的核心,它以XML格式描述了所有与项目有关的信息。

首先介绍一个概念:坐标

坐标是指项目的唯一标识,以 GAV(groupId,artifactId 和 version)区分,这里我们可以将 groupId 理解为某某公司的 xxx 组或者产品线,开发了某一个项目,对应的版本为 XXX。这里 groupId 包含公司和内部组(或产品线)的信息,如 org.apache.commons,表示 Apache
软件组织下的 Java Commponents 产品线;ArtifactId 则表示项目的名称,如 commons-io,表示项目名称,Version 则表示某一 Artifact 的版本,如 1.3.2,1.3.3-SNAPSHOT 等。

当我们打开一个POM文件,首先看到的是一段描述我们正在建立的artifact信息:

[xml]
<?xml version="1.0" encoding="UTF-8"?>
<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>
[/xml]

这是强制性的开端部分。接下来是一组坐标。描述了当前项目的groupId, artifactId, version和name。

下面是<properties>。我们可以把properties理解为一组自定义的变量。我们可以在下面定义的依赖中使用这些变量,这样未来在我们需要升级包版本等场景时,可以通过修改变量的值来方便的实现。大家可以参照petstore的pom.xml文件来理解。

而后是依赖管理的部分。

[xml]
<dependencies>
<dependency>
<groupId>jdbm</groupId>
<artifactId>jdbm</artifactId>
<version>1.0</version>
</dependency>
[/xml]

这是一个获取jdbm的简单依赖。默认情况下,Maven通过访问http://www.ibibio.ort/maven2/来获得依赖,如果你查看jdbm/jdbm/1.0/目录,就会发现jdbm-1.0.jar文件,Maven将恢复它;以及一个简短的jdbm pom.xml文件,它列举artifact本身拥有的任何依赖。你可以手动浏览ibibio贮藏库或使用MVN Registry这样的网站来搜索贮藏库。

下一个要讨论的依赖是dwr,但你在ibibio贮藏库中找不到它。你必须将它安装到我们自己的本地贮藏库中。

[xml]
<dependency>
<groupId>dwr</groupId>
<artifactId>dwr</artifactId>
<version>2.0M3</version>
</dependency>
[/xml]

下一个依赖为Java Servlet API。在ibibio库中可以找到它,但我们只有在建立项目的时候才需要它;因为当我们配置一台网络服务器时,servlet API已经存在。

[xml]
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4-20040521</version>
<scope>provided</scope>
</dependency>
[/xml]

scope说明何时需要这个artifact,因此“provided”说明artifact由运行时间环境提供。另一个scope类型为“test”,它说明只有在测试时需要artifact。例如,我们这样包括Junit:

[xml]
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
[/xml]

那么,我们如果想引入一个依赖,应该怎么写这个dependency呢?其实我们可以通过远程仓库来搜索每个构建对应的XML描述。

常用的搜索页面有:maven.oschina.net,以及search.maven.org。我们在其中搜索一个构建,便可以得到它对应的XML描述。

现在,POM还剩最后一块内容:插件。

[xml]
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
[/xml]

Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

生命周期

Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

我再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

知道了每套生命周期的大概用途和相互关系以后,来逐个详细看一下每套生命周期,Clean和Site相对比较简单,先解释一下。

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有点绕?要知道有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  • pre-clean  执行一些需要在clean之前完成的工作
  • clean  移除所有上一次构建生成的文件
  • post-clean  执行一些需要在clean之后立刻完成的工作

mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

下面看一下Site生命周期的各个阶段:

  • pre-site     执行一些需要在生成站点文档之前完成的工作
  • site    生成项目的站点文档
  • post-site     执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy     将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

最后,来看一下Maven的最重要的Default生命周期,绝大部分工作都发生在这个生命周期中,这里只解释一些比较重要和常用的阶段:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources     复制并处理资源文件,至目标目录,准备打包。
  • compile     编译项目的源代码。
  • process-classes
  • generate-test-sources 
  • process-test-sources 
  • generate-test-resources
  • process-test-resources     复制并处理资源文件,至目标测试目录。
  • test-compile     编译测试源代码。
  • process-test-classes
  • test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package     接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install     将包安装至本地仓库,以让其它项目依赖。
  • deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

基本上,根据名称我们就能猜出每个阶段的用途,关于其它阶段的解释,请参考 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。

骨架

Maven约定的项目目录结构,如果手动创建,每个工程的重复工作非常多。为此,Maven提供了Archetype以帮助我们快速勾勒出项目骨架。

在IntelliJ IDEA中,使用Maven的骨架创建项目非常简单。我们只需选择File→New Project→Maven,勾选Create from archetype,然后在下方选择所需要使用的骨架(例如maven-archetype-webapp),点击Next按照向导提示操作即可。在选择骨架时,也可以直接输入关键词查找相应的骨架。

资料推荐

一些maven书籍介绍和一些maven视频介绍:
http://pan.baidu.com/s/1hq00qLA

国外非常不错的学习材料网站,集成了介绍、快速引导,书籍推荐等:
http://www.tutorialspoint.com/maven/index.htm

maven官网:
http://maven.apache.org/

官网介绍什么是maven:
http://maven.apache.org/what-is-maven.html

maven2和maven3的区别(目前主流是maven3):
http://tech.it168.com/a2010/1108/1123/000001123274_all.shtml
http://www.infoq.com/cn/news/2011/07/xxb-maven-10-time-to-update

maven下载:
http://maven.apache.org/download.cgi
windows需要下载的文件:apache-maven-版本号-bin.zip

maven官网5分钟速成:
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

maven官网入门指南:
http://maven.apache.org/guides/getting-started/index.html

FAQ英文官网:
http://maven.apache.org/general.html

FAQ英文非官网:
http://docs.codehaus.org/display/MAVENUSER/FAQs-1

maven一些插件列表:
http://maven.apache.org/plugins

Maven 的41种骨架功能介绍:
http://www.cnblogs.com/iusmile/archive/2012/11/14/2770118.html
http://docs.codehaus.org/display/MAVENUSER/Archetypes+List

[7.11实习笔记] 环境搭建 JDK+IDEA+MAVEN+JBOSS+HSF+SVN

7月11日流水

今天上午领了工牌和PC。排了一个多小时的队。本来8点半到想着能早点领,没想到排PC的队排了半天突然工作人员一句“实习入职跟我来”,队伍全乱了……好不容易领了机子到IT临时服务点配置了一下,出来都快11点了。无力吐槽。

webwxgetmsgimg (3)

回到工位就把工牌和支付宝绑定了。这样在园区各个地方都不用带钱包,食堂超市直接刷工牌。还是比较方便的。

webwxgetmsgimg (4)

下午就是根据师姐给的内部百科链接(叫翔哥的师兄写的文档),以及一个Taobao_Developer_Cookbook的文档开始搭建工作环境。具体的笔记在下面会写。第一次搭这些环境还是比较蛋疼的。记录下来也好以后备查。

7月11日笔记

首先,明确需要搭建的环境:

  1. JDK 1.6.0_43
  2. IntelliJ IDEA 13.1.3(社区版)
  3. Maven 2.2.1
  4. JBoss 4.2.2.GA
  5. HSF 2.1.0.6
  6. TortoiseSVN 1.8

其次,阿里统一将这些环境安装在D:java_tools目录下。

为何要规划安装目录? 

开发人员之间经常会进行一些交流或者协助排查问题,最常见的几句话?“你的 Java 安装在哪里?”;“JBoss 安装在哪个目录下?我要改一下设置!”。“Eclipse 安装在哪个目录下,打开一下!”。如果不想让你的同事费心做这些事情,那最好将这些开发用的软件安装在指定的目录下,这样大家的环境都一样,排查问题就方便很多。还有 Java 软件最忌安装在有空格或者中文的目录下,这个一定需要注意一下。

为何要使用旧版的环境? 

版本还是挺重要的,有些高版本会导致一些莫名其妙的错误。师兄曾遇到过Maven版本的问题,总提示日志系统不存在。

接下来就可以依次搭建这些环境啦~

JDK 1.6.0_43

软件环境:Windows版,64位

下载地址:http://dl1.cr173.com//soft1/jdk-6.zip

安装配置:

  1. 下载并解压ZIP包。执行其中的jdk-6u43-windows-x64.exe,根据提示完成安装
  2. 配置环境变量:计算机→属性→高级系统设置→高级→环境变量
  3. 系统变量→新建JAVA_HOME变量。值为JDK安装目录。
  4. 系统变量→寻找PATH变量→编辑。在值的末尾加上JDK安装路径下bin目录,以及jre的bin目录(目录间以;分隔)
  5. 系统变量→新建CLASSPATH变量,值为 .; 以及JDK目录下lib目录,以及这个lib目录下的tools.jar
  6. 测试是否安装成功:启动cmd,输入java –version。如果显示版本号则安装成功。

IntelliJ IDEA 13.1.3(社区版)

软件环境:Windows 社区版(这是商业软件,是付费的。但社区版是免费的。)

下载地址:http://download-cf.jetbrains.com/idea/ideaIC-13.1.3.exe

安装配置:

  1. 下载并执行安装程序,根据提示完成安装
  2. 修改IDE外观与字体:File→Settings→IDE Settings→Appearance 在这里选择喜欢的Theme,以及Override default fonts by的字体和字号;
  3. 修改代码字体:File→Settings→IDE Settings→Editor→Colors & Fonts→Font 先在Scheme name处点Save As,输入自己的配置的名字;然后设置自己喜欢的字体字号和间距。个人比较喜欢Source Code Pro,看着很舒服。
  4. 解决中文乱码:在上一步把Show only monospaced fonts的勾去掉,Primary font选自己喜欢的英文字体,勾选Secondary font并选择一个中文字体。我选的是微软雅黑(Microsoft YaHei UI)。
  5. 显示行号:File→Settings→IDE Settings→Editor→Appearance,勾选Show line numbers以显示行号。

更多技巧:http://www.cnblogs.com/sky100/archive/2009/01/22/1379949.html

插件使用:

  1. 插件安装的方法:
    1. File→SettingsIDE Settings→Plugins 点击Browse repositories按钮。
    2. 在搜索框直接搜索想要的插件
    3. 点击右边的install plugin按钮就可以了。
  2. 常用插件:
    1. Identifier Highlighter 高亮显示选中变量插件
    2. Key Promoter 快捷键提示插件
    3. Jrebel 热部署插件(需破解。破解方法:http://my.oschina.net/lujianing/blog/178578#OSC_h2_3
    4. FindBugs for IntelliJ IDEA
    5. TabSwitch 通过ctrl+tab在文件、各个面板间切换。
    6. Mybatis
    7. EncodingPlugin 可按项目指定其默认编码,非常有用

(更多插件请参阅http://blog.csdn.net/sunny243788557/article/details/26556967

Maven 2.2.1

下载地址:http://dxdown1.onlinedown.net/down/apache-maven-2.2.1-bin.tar.zip

安装配置:

  1. 下载并解压ZIP包。将其解压到安装路径。
  2. 下载 http://baike.corp.taobao.com/images/9/96/Maven_Settings.xml 这个配置文件,并覆盖到mavenconf目录中。
  3. 设置系统环境变量(同上文JDK的方法),将安装目录下bin目录添加到PATH环境变量值中。
  4. 新建系统环境变量M2_HOME,设置值为maven安装目录。
  5. 测试是否安装成功:启动cmd,输入mvn –version。如果显示版本号则安装成功。
  6. 执行mvn help:system进行mvn的初始化工作,主要是检查artifact是否能正确下载,初始化Maven本地仓库等。

JBoss 4.2.2.GA

软件环境:我们这里要使用的是阿里修改过的JBoss线上通用版本,和官方版本不一样,修改了classloader双亲委派。

下载地址:http://hsf.taobao.net/software/jboss-4.2.2.GA.zip

安装配置:

  1. 下载并解压ZIP包。将其解压到安装路径。
  2. 新建系统环境变量JBOSS_HOME,设置值为JBoss安装路径。
  3. 测试是否安装成功:运行Jboss安装目录下bin目录中的run.bat,若窗口中没有出现异常,且出现10:16:19,765 INFO [Server] JBoss (MX MicroKernel) [4.2.1.GA (build: SVNTag=JBoss_4_2_1_GA date=200707131605)] Started in 30s:828ms字样,则表示安装成功。
  4. 我们可以通过访问 http://localhost进入JBoss的欢迎界面

HSF 2.1.0.6

下载地址:http://hsf.taobao.net/hsfversion/hsf2.1.0.6/taobao-hsf.tgz

安装配置:

  1. 下载tgz包。
  2. 将其解压到JBoss目录下的serverdefaultdeploy目录下即可。

TortoiseSVN 1.8

软件环境:Windows 64位版

下载地址:http://cqindex.newhua.com/down/TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.zip

安装配置:

  1. 下载并解压ZIP包,执行其中的安装程序。
  2. 根据提示进行安装。在组件选择的一步,记得勾选command line client tools(默认是不安装这个部分的)。没装的话,IDEA可能会报错,提示执行svn命令出错。

至此,基本的开发环境搭建就完成了。后面就要开始学习啦~