maven3.0.4学习笔记
一、 安装
1.Maven安装比较简单,下载完后进行解压。配置环境变量M2_HOME (maven安装目录),将bin目录添加到path路径中。
下载地址:http://maven.apache.org/download.html
检查安装是否成功:在命令窗口中输入mvn –v 控制台能显示maven相关信息表示安装成功。
2.设置HTTP代理
<settings>
......
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>192.168.1.1></host>
<port>3128</port>
<!--
<username>***</username>
<password>***</password>
<nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts>
-->
</proxy>
</proxies>
....
</settings>
二、 目录结构
bin目录:
该目录包含了mvn运行的脚本,其中mvn、mvnDebug是基于UNIX平台的shell脚本,mvn.bat、mvnDebug.bat是基于windows平台的bat脚本。该目录还包含m2.conf文件,这是classworlds的配置文件。
boot目录:
该目录只包含一个文件,plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,maven使用该框架加载自己的类库
conf目录:
settings.xml。直接修改该文件,就能在机器上全局地定制maven的行为,
一般情况下,我们更偏向于复制该文件至用户目录。然后修改该文件,在用户范围定制maven的行为。
lib目录:
该目录包含了所有maven运行时需要的java类库
src目录:
maven源文档目录
三、 安装maven m2eclipse插件
m2eclipse插件在线安装地址: http://m2eclipse.sonatype.org/sites/m2e
插件安装完成后,打开 window-->preference-->Maven-->Installations ,点击Add...,选择我们自己安装的Maven目录。
preference-->Maven-->Installations-->user settings,点击browse,选择自己的maven本地仓库。
preference-->Java-->Installed JREs,点击Add..., 选择我们自己安装的JDK
安装m2eclipse需要提醒的一点是,你可能会在使用 m2eclipse 时遇到类似这样的错误:Eclipse is running in a JRE, but a JDK is required
这是因为 Eclipse 默认是运行在 JRE 上的,而 m2eclipse 的一些功能要求使用 JDK,解决方法是配置 Eclipse安装目录的eclipse.ini 文件,在-vmargs参数之前分2行添加vm配置指向 JDK,如:
-vm
D:\java\jdk1.6.0_07\bin\javaw.exe
配置用户范围的setting.xml
复制%M2_HOME%/conf/setting.xml到用户目录下
四、 Maven入门
1、maven项目结构
/src/main/java 工程java源代码目录
/src/main/resources 工程的资源目录
/src/test/java 单元测试java源代码目录
/src/test/resources 单元测试资源目录
/target 输出目录,所有的输出物都存放在这个目录下
/target/classes 编译之后的class文件
2、pom.xml文件
Maven项目的核心是pom.xml。POM(Project Object Model项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖。pom.xml文件结构类似于:
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
modelVersion:指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0。
groupId:定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。通常为公司名称.项目名称。
artifactId:定义了当前Maven项目在组中唯一的ID。通常为项目名称-模块名称
version:指定了该项目当前的版本——1.0-SNAPSHOT,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本
name:元素声明了一个对于用户更为友好的项目名称,不是必须的。
packaging:定义maven项目的打包方式,默认为jar
properties:声明常量信息。通过${变量名}引用
dependencies:指定了当前项目的所有依赖。所有的依赖都是通过坐标来进行存储的(GAV)。该元素下可以包含多个dependency元素以声明项目的依赖。groupId、artifactId、version是maven项目的基本坐标。有了这段声明后,maven会自动到中央仓库下载junit jar包。
maven最主要的命令
mvn clean compile:是清理target的内容并编译,
mvn clean test:是执行测试,
mvn clean package:是打包,
mvn clean install:是将项目输出的jar安装到maven的本地仓库中
执行maven clean compile,控制台输出
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building tsp-user 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ tsp-user ---
[INFO] Deleting D:\workspace\tsp-user\target
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ tsp-user ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\workspace\tsp-user\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ tsp-user ---
[INFO] Compiling 1 source file to D:\workspace\tsp-user\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.813s
[INFO] Finished at: Mon Oct 29 10:09:27 CST 2012
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------
clean 告诉maven清楚输出目录target/,compile告诉maven编译项目主代码,从输出中可以看到maven首先执行了clean:clean任务,删除target目录,接着执行resources:resources任务,最后执行compile:compile任务。将项目主代码编译到target/classes下。
clean:clean
resources:resources
compile:compile
对应一些maven插件及插件目标。clean:clean是clean插件的clean目标。
<scope>test</scope>,<scope>为依赖范围,如依赖范围为test,表示只对测试有效。如不声明依赖范围默认为compile.
maven compile插件默认只支持编译jdk1.3,配置插件支持jdk5
<build>
......
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
......
</plugins>
</build>
为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions><execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransFormer">
<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution></executions>
</plugin>
使用Archetype生成项目骨架:如果是maven3,简单地运行mvn archetype:generate。如果是maven2,最好运行命令mvn org.apache.maven.plugin.plugins:maven-archetype-plugin:2.0-alpha-5:generate
<version>${springversion}</version>
13.优化依赖:maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围。对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那些依赖被称为解析依赖。运行下面两条命令分别可以查看当前项目的已解析依赖。