参阅书籍《maven实战》

##maven是什么?
maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理,可以帮助我们自动化构建过程。
(构建:清理、编译、运行单元测试、生成文档、打包、部署等)
maven解决版本依赖,通过一组坐标maven可以准确定位每一个构件——artifact。

##maven安装(Windows)

  • 首先确保自己安装JDK1.4及其以上版本,运行以下命令进行检测
   
$ echo %JAVA_HOME% 
$ java -veriosn
  • 下载maven,解压放置工作目录
    配置环境变量,如M2_HOME=C:\apache-maven-3.0.5
    增加PATH后增加%M2_HOME%/bin/
  • 测试maven环境配置,执行以下命令
   
$ mvn -v

##配置HTTP代理
有些时候为了公司安全,需要为Maven配置HTTP代理才可以正常访问外部仓库
用户配置文件(~/.m2/settings.xml)
全局配置文件($M2_HOME/conf/settings.xml)
详细信息可见settings.xml文件

##在Eclipse中安装maven插件
在Help->Eclipse Marketplace中搜索maven,安装Maven Integration for Eclipse

默认情况下Eclipse运行在jre上,而m2eclipse的一些功能需要运行在jdk上,解决方案是在eclipse.ini文件中增加如下

1
2
3
4
5
6
7
8
9
10
11
12
   
--launcher.XXMaxPermSize   
256m   
-vm   
C:\Program Files\Java\jdk1.7.0_79\bin\javaw.exe   
--launcher.defaultAction   
openFile   
--launcher.appendVmargs   
-vmargs   
-Dosgi.requiredJavaVersion=1.6   
-Xms128m   
-Xmx512m   

###更换jre
jdk安装时,会在同目录下安装一个jre。在Window->Preferences->Java->Installed JREs中将jre更改为jdk目录中的jre。

###不使用内嵌的maven
为了使命令行操作和IDE中使用相同的maven。在Window->Preference->Maven->Installation。点击右侧的Add选择maven安装目录。

##Maven样例

####1. 编写POM文件
创建项目文件夹,在项目根目录下创建pom.xml,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.4"
         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.juvenxu.mvnbook</groupId>
          <artifactId>hello-world</artifactId>
          <version>1.0-SNAPSHOT</version>
          <name>Maven Hello World Project</name>
</project>
  • 第一行是XML头,指定该XML文档版本和编码方式。
  • project元素是所有pom.xml的根元素,其还声明了一些pom相关的命名空间和xsd元素。
  • 根元素的第一个子元素modelVersion指定了当前pom模型的版本。对于Maven2和Maven3来说只能是4.0.0。
  • groupId、artifactId、version是定义一个项目的基本坐标。
  • groupId定义了项目属于哪个组。如com.mycom.myapp
  • artifactId定义了当前maven项目在组中唯一的ID。如myapp-web、myapp-domain、myapp-util。
  • version指定了当前项目的版本。如1.0-SNAPSHOT。
  • name元素是对于用户更友好的项目名称,不是必须的。

####2. 编写主代码
在项目根目录下创建src/main/java目录,在该目录下创建com/juvenxu/mvnbook/helloworld/HelloWorld.java,其内容如下:

1
2
3
4
5
6
7
8
9
package com.juvenxu.mvnbook.helloworld;
public class HelloWorld {
     public String sayHello() {
          return "Hello Maven";
     }
     public static void main(String[] args) {
          System.out.print(new HelloWorld().sayHello());
     }
}

在项目根目录下运行

$ mvn clean compile

####3. 编写测试代码 本次测试使用JUnit测试工具
首先为pom添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.4"
          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.juvenxu.mvnbook</groupId>
          <artifactId>hello-world</artifactId>
          <version>1.0-SNAPSHOT</version>
          <name>Maven Hello World Project</name>
          <dependencies>
               <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.7</version>
                    <scope>test</scope>
               </dependency>
          </dependencies>
</project>

在项目根目录下创建src/test/java目录,在该目录下创建com/juvenxu/mvnbook/helloworld/HelloWorldTest.java,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
package com.juvenxu.mvnbook.helloworld;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class HelloWorldTest {
     @Test
     public void testSayHello() {
          HelloWorld helloworld = new HelloWorld();
          String result = helloworld.sayHello();
           assertEquals("Hello Maven", result);
     }
}

在项目根目录下运行

$ mvn clean test

####4. 打包 在项目根目录下运行

$ mvn clean package。

项目pom并未指定打包的类型,默认打包类型为jar。 maven会在打包之前执行编译、测试等操作。 jar插件的jar目标将项目主代码打包成hello-world-1.0-SNAPSHOT.jar并位于target目录下。

如果要让其他maven项目使用此jar包,需要将jar包安装到maven本地仓库中。执行以下命令

$ mvn clean install

####5. 运行 至此我们开始运行Hello World项目,默认打包生成的jar不能直接运行,因为main方法的类信息不会添加到manifest中(jar文件中的META-INF/MANIFEST.MF文件)。我们需要借助maven-shade-plugin插件运行。

修改pom文件为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.4"
          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.juvenxu.mvnbook</groupId>
          <artifactId>hello-world</artifactId>
          <version>1.0-SNAPSHOT</version>
          <name>Maven Hello World Project</name>
          <dependencies>
               <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.7</version>
                    <scope>test</scope>
               </dependency>
          </dependencies>
          <build>
               <plugins>
                    <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>
               </plugins>
          </build>
</project>

我们配置了mainClass为com.juvenxu.mvnbook.helloworld.HelloWorld,打包时这些信息将放入MANIFEST中。执行以下命令

$ mvn clean install,

构建完成之后在target目录下产生hello-world-1.0-SNAPSHOT.jar 和 original-hello-world-1.0-SNAPSHOT.jar。 前者带有Main-Class信息的可运行jar,后者为原始的jar。 执行jar文件

$ java -jar target\hello-world-1.0-SNAPSHOT.jar

####6. 使用Archetype生成项目骨架 以maven3为例 运行mvn archetype:generate,会让你选择archetype的编号,默认编号对应maven-archetype-quickstart,直接回车选择该archetype。紧接着输入groupId、artifactId、version以及包名package。

例如:

1
2
3
4
5
6
7
8
9
10
Define value for property 'groupId': : com.juvenxu.mvnbook
Define value for property 'artifactId': : hello-world
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  com.juvenxu.mvnbook: : com.juvenxu.mvnbook.helloworld
Confirm properties configuration:
groupId: com.juvenxu.mvnbook
artifactId: hello-world
version: 1.0-SNAPSHOT
package: com.juvenxu.mvnbook.helloworld
Y: : Y

##maven常用命令: 检测Maven版本:

$ mvn -v # 或者 
$ mvn -version 

获取帮助选项:

$ mvn -h # 或者 
$ mvn -help 

显示详细错误信息:

$ mvn -e

创建Java项目:

$ mvn archetype:create 
     -DgroupId=${groupId} 
     -DartifactId=${artifactId}
#样例:
$ mvn archetype:create
     -DgroupId=com.mycom
     -DartifactId=myapp
     -Dversion=0.1

创建Web项目:

$ mvn archetype:create
     -DgroupId=${packageName}
     -DartifactId=${webappName}
     -DarchetypeArtifaceId=maven-archetype-webapp

转换成Eclipse工程

$ mvn eclipse:eclipse

清除Eclipse设置信息

$ mvn eclipse:clean

转换成idea项目

$ mvn idea:idea

编译源代码

$ mvn compile

编译测试代码

$ mvn test-compile

产生site

$ mvn site

测试

$ mvn test 
$ mvn test -Dtest=${类名} # 单独运行测试类

打包

$ mvn package
$ mvn package -Dmaven.test.skip=true # 打包时不执行测试

清除

$ mvn clean # 将清除原来编译的结果

发布

$ mvn install # 将项目打包成构件安装到本地仓库
$ mvn deploy # 发布到本地仓库或服务器