首页 > 代码库 > Maven入门
Maven入门
上一篇中已经安装好了Maven,这一篇以经典的Hello World为例讲述Maven基本操作流程。
Maven主要完成自动化构建过程,其核心就在于配置文件pom.xml。POM(Project Object Model)定义了项目的基本信息,描述了项目如何构建,项目依赖等。
一,项目目录结构及代码
先上一张目录结构图,在helloworld项目文件夹下执行tree命令:
.
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── yxl
│ └── helloworld
│ └── HelloWorld.java
└── test
└── java
└── com
└── yxl
└── helloworld
└── HelloWorldTest.java
11 directories, 3 files
现在解释目录各文件夹的意义,约定俗成的,pom.xml是核心配置文件,后面细说。src/main/java/是放置源代码的目录,maven会自动搜寻该目录进行编译等操作。com.yxl.helloworld是包名,所以后面有三层目录com/yxl/helloworld/。src/test/java/是放置测试代码的目录。HelloWorld.java是主代码,如下所示:
1 package com.yxl.helloworld; 2 3 public class HelloWorld 4 { 5 public String sayHello() 6 { 7 return "Hello World"; 8 } 9 public static void main(String[] args) 10 { 11 System.out.println(new HelloWorld().sayHello()); 12 } 13 }
代码只有一个方法sayHello,该类带有一个main方法,使得编译后的结果可以直接运行。
测试代码为HelloWorldTest.java,如下所示:
1 package com.yxl.helloworld; 2 3 import static org.junit.Assert.assertEquals; 4 import org.junit.Test; 5 6 public class HelloWorldTest 7 { 8 @Test 9 public void testSayHello() 10 { 11 HelloWorld helloWorld = new HelloWorld(); 12 String result = helloWorld.sayHello(); 13 assertEquals("Hello World", result); 14 } 15 }
二,pom.xml配置文件介绍
先上代码,pom.xml:
1 <?xml version = "1.0" encoding = "UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.yxl.helloworld</groupId> 8 <artifactId>helloworld</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <packaging>jar</packaging> 11 12 <name>helloworld</name> 13 <url>http://maven.apache.org</url> 14 15 <properties> 16 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>junit</groupId> 22 <artifactId>junit</artifactId> 23 <version>4.7</version> 24 <scope>test</scope> 25 </dependency> 26 </dependencies> 27 28 <build> 29 <plugins> 30 <plugin> 31 <groupId>org.apache.maven.plugins</groupId> 32 <artifactId>maven-shade-plugin</artifactId> 33 <version>2.3</version> 34 <executions> 35 <execution> 36 <phase>package</phase> 37 <goals> 38 <goal>shade</goal> 39 </goals> 40 <configuration> 41 <transformers> 42 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 43 <manifestEntries> 44 <Main-Class>com.yxl.helloworld.HelloWorld</Main-Class> 45 <Build-Number>123</Build-Number> 46 </manifestEntries> 47 </transformer> 48 </transformers> 49 </configuration> 50 </execution> 51 </executions> 52 </plugin> 53 </plugins> 54 </build> 55 56 </project>
第一行是XML头部,指定了XML的版本和编码方式。
2-4行声明了一些POM相关的命名空间及xsd元素,不是必须的,但能够让第三方工具(如IDE中的XML编辑器)帮助我们快速编辑POM。
modervison指定了当前POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0。
7-9行是pom.xml中最重要的内容,它定义了项目的坐标,在Maven的世界中,所有的jar,pom和war都基于这些坐标进行区分。groupId定义了项目属于哪个组,通常和所在的公司关联,假如公司是yxl,开发了一个myapp的项目,那么groupId一般定义为com.yxl.myapp。artifactId定义了当前项目在组中唯一的ID,version定义了项目的版本,第一版一般定义为1.0-SNAPSHOT,后面升级的可以陆续命名为1.1,2.0等。
19-26行定义了使用JUnit的依赖,其中,groupId是junit,artifactId是junit,版本是4.7,其他版本也可以,这三个元素构成了JUnit的坐标,Maven会自动下载junit-4.7.jar包。其中还有一个值为test的scope元素,它表示依赖范围,test表示该依赖只在测试环境中有效。
28-54行为了让生成的jar包可执行,执行mvn clean package生成的JAR包默认是不可执行的,因为带有main方法的信息不会被添加到manifest中。使用java -jar运行该包时,报错如下:
no main manifest attribute, in original-helloworld-1.0-SNAPSHOT.jar
为了生成可执行的JAR包,需要借助maven-shade-plugin插件,生成可执行JAR包只是该插件的功能之一,其他功能见官网,配置示例网址为:
http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html
关键的一行在于mainClass,它重新设定了程序运行的入口地址,其内容就是我们编写的类名称。在运行mvn clean package生成可执行JAR包,当使用java -jar命令再次执行该包时,正常输出结果。
三,Maven基本命令
1,编译主代码
mvn clean compile
2,进行代码测试
mvn clean test
3,打包
mvn clean package
4,运行,生成的可执行jar包位于新生成的targe目录下,其中还包含了很多其他文件内容,这里略过。
java -jar target/helloworld-1.0-SNAPSHOT.jar
5,安装,即将生成的jar包安装到本地仓库,供其他项目使用
mvn clean install
6,使用原型,如果每次构建Maven项目都需要调用mkdir一个个生成指定目录未免繁琐,我们使用原型快速构建目录结构,需要做的只是按照提示使用默认值或者指定值,像groupId,artifactId等肯定是自己指定的,而version等就可以使用默认值即可。
mvn archetype:generate
OK,大功告成咯,看来整个HelloWorld也不容易啊。
Maven入门