今天开始学习Maven。也开始尝试用博客记录自己的学习历程。写下心得体会以便日后巩固。
水滴石穿。
准备的学习资料主要是机械工业出版社《Maven实战》这本书,该书基于Maven3。豆瓣上的评价不错。
另外的资料就是网上的文档和stack overflow了。
今天大致了解了一下Maven的背景,搭了搭环境,照猫画虎一个hello world。
既然是跨平台的东西,我就在windows上用吧。从http://maven.apache.org/download.html下载3.0.4版本,配置好环境变量M2_HOME=D:\bin\apache-maven-3.0.4,加入Path。 即可在命令行执行mvn脚本。相当轻松。
在eclipse上安装m2eclipse插件还是花了点力气的。顺着http://m2eclipse.sonatype.org/sites/m2e去安装,一直报错,说是缺少插件或者不兼容,网上找了一通,装了GEF,subclipse,还是不成功。 最后发现m2eclipse已经交由eclipse基金会维护了,发布在http://eclipse.org/m2e上。于是直接从这里安装就一路顺风顺水了。看来这书虽然是11年出版的,还是没跟上时代的步伐啊:)
基本上搭环境的难度不大。于是就开始上手hello world吧。
首先是在非IDE环境下。在hello-world根目录下建一个pom.xml配置文件,POM(Project Object Model)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
主代码:
package com.able.mvnbook.helloworld;
public class HelloWorld {
public String sayHello() {
return "Hello Maven!!";
}
public static void main(String[] args) {
System.out.println(new HelloWorld().sayHello());
}
}
测试代码:
package com.able.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);
}
}
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.able.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.able.mvnbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
其中groupId定义了项目属于的组,往往与项目所在组织或公司有关。
artifactId定义当前Maven项目在组中的唯一ID。
version定义版本号,这里用SNAPSHOT表示尚处于开发中。这个我倒是第一次学到。
name定义一个对用户更为友好的项目名称,便于信息交流。
测试代码用了JUnit,因此在pom.xml中需要配置一个依赖,即dependency用于声明。其中scope声明为test表示该依赖只对测试有效,在测试代码中import JUnit代码可用而在主代码中import JUnit就会造成编译错误。 当然,默认的scope是compile,表示依赖对主代码和测试代码均有效。
为了把包含入口main方法的类信息添加到manifest中,以生成可执行的jar文件,需要配置一个maven-shade-plugin插件。配置完后项目在打包时会把mainClass信息放在MANIFEST中,执行mvn clean install,构建完成后在target目录下可以看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前者可运行,后者为原始jar。 在项目根目录执行java -jar target\hello-world-1.0-SNAPSHOT.jar即可得到控制台输出内容。
几个命令行下常用的命令,顾名思义即可:
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
其中clean 是告诉Maven清理输出目录target。
至此,命令行使用基本就可以了。
在eclipse上可以用Import Maven Project导入之前写的项目,也可以直接new一个新的项目,记得在select an archetype的地方选择maven-archetype-quickstart,然后根据与前面相同的规则输入groupId,artifactId,version,package等信息即可创建新的Maven项目。在运行时,会发现Run as下面有很多常用的命令,规则和前面也是一样的,一跑就通。
于是,Maven的初期工作完成。接下来继续学习。