1.编写POM
Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖。
基于Maven开发的Hello World
创建一个helloworld文件夹,并在该文件夹下新建pom.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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gqshao.myapp</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <name>Maven Hello World Project</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
第一行是XML头,指定xml文档的版本和编码方式
project:project元素是所有pom.xml元素的根,它还声明了一些POM相关的命名空间及xsd元素,这些属性用于第三方工具(如IDE中的XML编辑器)帮助我们编辑POM。
modelVersion:元素指定了当前POM模型的版本,Maven2及Maven3来说,只能是4.0.0
groupId:定义了项目属于哪个组比如公司是mycom,项目为myapp,那么groupId就应该是com.mycom.myapp
artifactId:定义当前Maven项目在组中唯一的ID,可以为不同的子项目(模块)分配artifactId
version:指定了当前的版本SNAPSHOT译为快照,说明该项目还在开发中,是不稳定的版本。
groupId、artifactId、version这三个元素定义了一个项目的基本坐标,在Maven中,任何jar、pom或者war都是基于这些基本坐标进行区分的
name:声明了一个对于用户更为友好的项目名称。
2.编写主代码
项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(如jar),而测试代码只在运行测试时用到,不会被打包。
约定:Maven项目主代码位于 src/main/java 目录
遵循Maven的约定,创建该目录,然后在该目录下创建文件com/gqshao/myapp/helloworld/HelloWorld.java
package com.gqshao.myapp.helloworld; public class HelloWorld{ public String sayHello(){ return "Hello World"; } public static void main(String[] args){ System.out.println(new HelloWorld().sayHello()); } }注意:Java类的包名是 com.gqshao.myapp.helloworld 这与之前POM中定义的groupId和artifactId相吻合。一般来说,项目中Java类的包都应该基于项目的groupId和artifactId。
在Hello World目录下运行mvn clean compile
D:\Hello World>mvn clean compile D:\Hello World>set MAVEN_OPTS= -Xms128m -Xmx512m [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Hello World Project 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ hello-world --- [INFO] Deleting D:\Hello World\target [INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ hello-world --- [debug] execute contextualize [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\Hello World\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ hello-world --- [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! [INFO] Compiling 1 source file to D:\Hello World\target\classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.639s [INFO] Finished at: Mon May 06 13:30:47 CST 2013 [INFO] Final Memory: 5M/123M [INFO] ------------------------------------------------------------------------
解释:clean告诉Maven清理输出目录target\,compile告诉Maven编译项目主代码。
从输出中看到Maven首先执行了clean:clean 任务,删除target\目录。默认情况下,Maven构建的所有输出都在target\目录中;
再执行resources:resources任务;
最后执行compiler:compile任务,将项目主代码编译至target\class目录(编译好的类在D:\Hello World\target\classes\com\gqshao\myapp\helloworld)
3.编写测试代码
约定:Maven项目测试代码位于 src/test/java 目录
为Hello World项目添加一个JUnit依赖,修改项目的POM如下:
... ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> ......dependencies:该元素下可以包含多个dependency元素以声明项目的依赖,这里添加了一个依赖dependency——groupId是junit,artifactId是junti,version是4.7。scope为依赖范围,test表示该依赖只对测试有效。
编写测试类
在D:\Hello World\src\test\java\com\gqshao\myapp\helloworld下新建HelloWorldTest.java
package com.gqshao.myapp.helloworld; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.gqshao.myapp.helloworld.HelloWorld; public class HelloWorldTest{ @Test public void testSayHello(){ HelloWorld helloWorld = new HelloWorld(); String result = helloWorld.sayHello(); assertEquals( "Hello Maven", result ); } }
进行测试
mvn clean test
如果遇到提示使用-source5或更高版本以启动注释在pom.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/xsd/maven-4.0.0.xsd"> ... ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
4.打包和运行
(1)在POM中没有指定打包类型,使用默认打包类型jar。
执行命令mvn clean package
注意:Maven在打包之前会执行编译、测试等操作。完成后会在D:\Hello World\target\下生成helloWorld-1.0-SNAPSHOT.jar
(2)在其他项目中使用该jar包
如果有需要,可以直接复制该jar包到其他项目的classpath中从而使用HelloWorld类,如果想让其他Maven项目直接饮用到这个jar
执行命令mvn clean install
注意:在打包之后又执行了install:install任务,并将项目输出jar安装到了Maven本地仓库中。
上述mvn clean compile、mvn clean test、mvn clean package、mvn clean install为Maven最主要的命令。
执行test之前会执行compile,执行package之前会执行test,执行install之前会执行package
5.生成可执行文件
借助maven-shade-plugin,配置如下:
<?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/xsd/maven-4.0.0.xsd"> <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.gqshao.myapp.helloworld.HelloWorld</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
plugin元素在<project>-<build>-<plugins>下面,在这里配置mainClass,项目在打包的时候会将该信息放到MANIFEST.MF中。
执行mvn clean install,在target\目录下生成helloWorld-1.0-SNAPSHOT.jar和original-helloWorld-1.0-SNAPSHOT.jar,后者是原始jar。
在helloWorld-1.0-SNAPSHOT.jar的META-INF\MANIFEST.MF中包含如下信息:
Main-Class: com.gqshao.myapp.helloworld.HelloWorld
执行该jar文件
D:\Hello World>java -jar target\helloWorld-1.0-SNAPSHOT.jar Hello Maven
5.使用Archetype生成项目骨架
遇到提示直接回车执行默认编号,对应的Archetype为maven-archetype-quickstart,紧接着输入groupId、artifactId、version以及package
或经过筛选
mvn archetype:generate -DarchetypeCatalog=internal 16: internal -> org.apache.maven.archetypes:maven-archetype-quickstart () 19: internal -> org.apache.maven.archetypes:maven-archetype-webapp (A simple Java web application)
6.m2eclipse简单使用
(1)导入项目
在eclipse中,File-Import-Other-Maven-Existing Maven Projects,在弹出的对话框中,Root Directory:选择要导入项目的目录。
(2)创建Maven项目
在eclipse中,File-New-Other-Maven-Maven Project,在弹出对话框中,使用默认选项(Use default Workspace location)-Next-选择maven-archetype-quickstart-Next-输入Group Id、Artifact Id、Version、Package-Finish
mvn archetype:generate
(3)运行mvn命令
在Maven项目上或pom.xml上右键,在弹出快捷菜单中选择Run As,就能看到常见的Maven命令;
如果默认选项中没有我们想要执行Maven命令,选择Maven build... 自定义Maven运行命令。在弹出对话框中的Goals中输入clean test。
这里还可以对内存进行优化选择第二个TAB: JRE,然后在VM arguments中输入配置如:
-Xms128m -Xmx512m
6.运行main方法
通过maven-compiler-plugin插件运行main方法,插件配置方式如下:
</build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build>
运行方法:
clean package exec:java -Dexec.mainClass=com.myapp.hadoop.remote.WordCount
7.Maven项目导入eclipse
通过maven-eclipse-plugin,配置方式如下:
<!-- eclipse插件, 设定下载依赖包的source code --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <downloadSources>true</downloadSources> <downloadJavadocs>false</downloadJavadocs> </configuration> </plugin>
运行命令
mvn eclipse:clean eclipse:eclipse
然后可以导入eclipse中
解释:clean告诉Maven清理输出目录target\,compile告诉Maven编译项目主代码。 从输出中看到Maven首先执行了clean:clean 任务,删除target\目录。默认情况下,Maven构建的所有输出都在target\目录中; 再执行resources:resources任务; 最后执行compiler:compile任务,将项目主代码编译至target\class目录(编译好的类在D:\Hello World\target\classes\com\gqshao\myapp\helloworld) 3.编写测试代码 约定:Maven项目测试代码位于 src/test/java 目录 为Hello World项目添加一个JUnit依赖,修改项目的POM如下: 编写测试类 在D:\Hello World\src\test\java\com\gqshao\myapp\helloworld下新建HelloWorldTest.java 进行测试 mvn clean test 如果遇到提示使用-source5或更高版本以启动注释在pom.xml中添加 4.打包和运行 (1)在POM中没有指定打包类型,使用默认打包类型jar。 执行命令mvn clean package 注意:Maven在打包之前会执行编译、测试等操作。完成后会在D:\Hello World\target\下生成helloWorld-1.0-SNAPSHOT.jar (2)在其他项目中使用该jar包 如果有需要,可以直接复制该jar包到其他项目的classpath中从而使用HelloWorld类,如果想让其他Maven项目直接饮用到这个jar 执行命令mvn clean install 注意:在打包之后又执行了install:install任务,并将项目输出jar安装到了Maven本地仓库中。 上述mvn clean compile、mvn clean test、mvn clean package、mvn clean install为Maven最主要的命令。 执行test之前会执行compile,执行package之前会执行test,执行install之前会执行package 5.生成可执行文件 借助maven-shade-plugin,配置如下: plugin元素在<project>-<build>-<plugins>下面,在这里配置mainClass,项目在打包的时候会将该信息放到MANIFEST.MF中。 执行mvn clean install,在target\目录下生成helloWorld-1.0-SNAPSHOT.jar和original-helloWorld-1.0-SNAPSHOT.jar,后者是原始jar。 在helloWorld-1.0-SNAPSHOT.jar的META-INF\MANIFEST.MF中包含如下信息: 执行该jar文件 5.使用Archetype生成项目骨架 遇到提示直接回车执行默认编号,对应的Archetype为maven-archetype-quickstart,紧接着输入groupId、artifactId、version以及package 或经过筛选 6.m2eclipse简单使用 (1)导入项目 在eclipse中,File-Import-Other-Maven-Existing Maven Projects,在弹出的对话框中,Root Directory:选择要导入项目的目录。 (2)创建Maven项目 在eclipse中,File-New-Other-Maven-Maven Project,在弹出对话框中,使用默认选项(Use default Workspace location)-Next-选择maven-archetype-quickstart-Next-输入Group Id、Artifact Id、Version、Package-Finish (3)运行mvn命令 在Maven项目上或pom.xml上右键,在弹出快捷菜单中选择Run As,就能看到常见的Maven命令; 如果默认选项中没有我们想要执行Maven命令,选择Maven build... 自定义Maven运行命令。在弹出对话框中的Goals中输入clean test。 这里还可以对内存进行优化选择第二个TAB: JRE,然后在VM arguments中输入配置如: 6.运行main方法 通过maven-compiler-plugin插件运行main方法,插件配置方式如下: 运行方法: 7.Maven项目导入eclipse 通过maven-eclipse-plugin,配置方式如下: 运行命令 然后可以导入eclipse中