1:pom.xml

Maven项目的核心文件,非常重要。POM(Project Object Model)项目对象模型,其定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。

创建一个最简单的pom文件:pom.xml,首先新建文件夹HelloWorld,在里面新建一个pom。xml,然后新建一个包(src/main/java),在新建一个包com.soulprayer.maven.maven_study,然后进入该文件夹,打开pom.xml文件(推荐使用Notepad++ / Sublime),并输入下列代码清单中的内容:

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.soulprayer.maven</groupId>
<artifactId>maven-study</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Maven Hello World Project</name>
</project>

pom.xml代码清单说明:

  • 第一行是XML头,指定该xml文档的版本和编码方式
  • <project></project>所有pom.xml的根元素,声明了一些pom相关的命名空间及xsd元素约束。
  • <modelVersion></modelVersion> 指定了当前POM模型的版本,对于Maven2一级Maven3来说,只能是4.0.0
  • <groupId></groupId>定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联
  • <artifactId></artifactId>定义了当前Maven项目在组中唯一的ID,
  • <version></version>定义了当前Maven项目的版本
  • <name> 定义了当前项目更加友好清晰的名称

备注:groupId、artifactId、version 三者共同确定唯一坐标,也就是说这个项目在整个Maven仓库中是唯一的.

优点:

它能让项目对象模型最大程度地与实际代码相独立,即解耦或者正交性。这在很大程度上避免了Java代码和POM代码相互影响,比如当项目需要升级版本时,只需要修改POM,而不需要修改Java代码,而在POM稳定之后,日常的Java代码开发工作基本不涉及POM的修改。

2:编写主代码

项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(如jar),而测试代码只在测试时用到,不会被打包。默认情况下,Maven项目的主代码位于/src/main/java目录中,我们遵循Maven的约定,创建该目录,然后在该目录下创建文件 com/soulprayer/maven/maven-study/HelloWorld.java。

代码清单如下:

package main.java.com.soulprayer.maven.maven_study;

public class HelloWorld {

    public String sayHello() {
return "Hello Maven";
} public static void main(String[] args) {
System.out.println(new HelloWorld().sayHello());
} }

这是一个很简单的Java类,它有一个sayHello()方法,返回一个String,同时还有一个Main方法,创建一个HelloWorld实例,调用sayHello()方法,并将结果输出到控制台上。

关于该Java代码有三点需要注意:

  • 应该把项目主代码放到src/main/java目录下(约定大于配置),这样就不需要额外的配置,Maven会自动搜索该目录找到项目主代码
  • 该Java类的报名是com.soulprayer.maven,这与之前在POM中定义的groupId和artifaceId相吻合。一般来说,项目中的Java类的包都应该基于项目的groupId和artifactId,这样更加清晰,也更加符合逻辑。
  • pom.xml的位置很重要,不要乱放,要放到和src平级的目录下,这样groupId才会生效,否则又会多一层。

代码编写完毕及满足上述条件后,在项目根目录下运行命令mvn cleam compile 会得到如图所示的输出结果。

clean会先告诉Maven清理输出目录 target/,compile告诉Maven编译项目主代码,从输出中看到Maven首先执行了clean:clean任务,删除 target/目录。默认情况下,Maven构建的输出都在target/目录中,接着执行resources:resources任务(未定义项目资源,略过),最后执行compiler:compile任务,将项目主代码编译至target/classes目录。

3:编写测试代码

为了使项目结构保持清晰,主代码与测试代码应该分开来放,放置于独立目录中,主代码的目录是/src/main/java,则对应的测试代码的目录是/src/test/java,因此,在编写测试用例之前,要先创建该目录,然后为其添加Junit依赖,本文使用Junit进行测试。

修改的POM的代码清单如下:

<?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.soulprayer.maven</groupId>
<artifactId>maven_study</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>

新增元素说明

  • <dependencies></dependencies>在该元素下可以包含多个<dependency>元素以声明项目的依赖,这里就通过groupId、artifactId、version三个元素定义了唯一的junit依赖标识。然后Maven会依据conf/setting.xml中的配置去中央仓库进行下载。
  • <scope></scope>依赖范围:test表示该依赖只对测试有效,换句话说,测试代码中import Junit代码是没问题的,但是如果在主代码中用import Junit代码,就会造成编译错误,如果不声明依赖范围,默认的就是compile,表示对主代码和测试代码都生效。

编写测试类 HelloWorldTest.java,代码清单:

package test.java.com.soulprayer.maven.maven_study;
import org.junit.Test
import static org.junit.Assert.assertEquals;
public class HelloWorldTest {

    @Test
public void testSayHello(){
HelloWorld helloWorld = new HelloWorld();
String result = helloWorld.sayHello();
assetEquals("Hello Maven",result);
} }

一个典型的单元测试包含三个步骤:

  • 准备测试类及数据
  • 执行要测试的行为
  • 检查结果

使用Maven执行测试

可以看到,Tests run(测试运行)1个,Failures(失败):0,Error(错误)0,Skipped(跳过):0

4:打包和运行

将项目进行编译、测试之后,下一个重要步骤就是打包(package)。HelloWorld的POM中没有指定打包类型,使用默认打包类型jar,简单地执行命令mvn clean package进行打包,可以看到如下输出:

实际上jar插件的jar目标将项目主代码打包成一个名为maven_study-1.0-SNAPSHOT.jar的文件。该文件也位于target/输出目录中,它是根据artifact-version.jar规则进行命名的。还可以使用finalName来自定义该文件的名称,这个会在后面说。

进行到这里,我们得到了项目的输出,一个jar文件,如果有需要的话,就可以复制这个jar文件到其他项目的Classpath中从而使用HelloWorld类。但是,如何才能让其他的maven项目直接引用这个jar呢,这里需要一个安装的步骤,执行mvn clean instal,效果图如下:

在打包之后,又执行了安装任务install。从输出中的红框中可以看到,该任务将项目的jar安装到了本地Maven仓库中,可以打开相应的文件查看到HelloWorld项目的pom和jar。之前的Junit的pom和jar也是同样的道理,只有构件被下载到本地仓库之后,才能由Maven项目所使用。

到目前为止,都没有运行HelloWorld项目,在HelloWorld中是存在一个main方法的。默认打包生成jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件的 META-INF / MANIFEST.MF文件,将无法看到Main-Class一行)。为了能够生成可执行的jar文件,需要借助maven-shade-plugin,错误图与插件配置如下:

插件配置代码清单:

<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.soulprayer.maven.maven_study.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

代码清单说明:

  • <build></build>:构建需要相关插件
  • <plugins></plugins>:同<dependencies></dependencies>,在该标签下可以包含多个<plugin>
  • <plugin></plugin>:具体插件,同<dependency>,利用其中的三者确定插件唯一标识。
  • <executions></executions>:同<dependencies></dependencies>,其标签下可以包含多个<execution>运行规则,我们指定了<phase>阶段为package的运行规则为实现了org.apache.maven.plugins.shade.resource.ManifestResourceTransformer这个接口将会把指定类:com.soulprayer.maven.maven_study.HelloWorld,作为程序入口类,并将其放入到程序清单中。

执行效果图

Maven实战03_Maven使用入门的更多相关文章

  1. 《Maven实战》笔记-1-Maven使用入门

    <Maven实战>徐晓斌 2011 机械工业出版社   一.介绍 1.名词 artifact:插件 极限编程XP 2.构建脚本: maven——pom.xml(Project Object ...

  2. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

  3. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  4. Maven&nbsp;3&nbsp;入门&nbsp;--&nbsp;安装与配置

    Maven 3 入门 -- 安装与配置 Maven以及其Eclipse插件m2eclipse的安装 (本文参考了Maven实战) 检查JDK的安装以及环境变量的配置 打开cmd echo %Java_ ...

  5. Maven实战:Maven生命周期

    前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...

  6. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  7. Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  8. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  9. 学习笔记——Maven实战(七)常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...

随机推荐

  1. 在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误

    这是 微信支付-统一下单 接口文档 一.问题描述 在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误 返回的错误xml如下: 二.排错过程 1.多 ...

  2. http://www.2cto.com/ 红黑联盟

    http://www.2cto.com/ 红黑联盟,一个不错的学习或者开阔眼界的网站,内部由中文书写.比较适合国人.

  3. HTTP协议响应篇

    http响应的基本介绍 一个HTTP响应代表服务器向客户端回送的数据, 由三个部分构成 状态行[200 , 302 304, 403, 404, 500] 响应消息头 返回的实体内容 http响应状态 ...

  4. 统计学习笔记之k近邻法

    1.kNN算法的思想:给定一个训练数据集,对新的输入实例,在训练集中找到与该实例最近邻的k个实例,这k个实例的多数属于某类,就把输入实例分为这个类. 2.算法 (1)根据给定的距离度量,在训练集T中找 ...

  5. Linux 实用指令(5)--组管理和权限管理

    目录 组管理和权限管理 1 Linux组基本介绍 2 文件/目录 所有者 2.1 查看文件的所有者 2.2 修改文件所有者 3 组的创建 3.1 基本指令 3.2 应用实例 4 文件/目录 所在组 4 ...

  6. naptime

    naptime 有一个长度为n的序列\(a_i\),首尾相接组成了一个环,现在要在这个环上选出若干个区间,使区间长度之和恰好为b,然后忽略区间的顺时针开头元素,权值累加区间中所有的数字,问权值的最大值 ...

  7. Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏【转】

    Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏[转] 标签: javajvm线程泄漏 2015-03-11 19:47 1098人阅读 评论(0) 收藏 举报   ...

  8. 廖雪峰Java11多线程编程-2线程同步-2synchronized方法

    1.Java使用synchronized对一个方法进行加锁 class Counter{ int count = 0; public synchronized void add(int n){ cou ...

  9. Python-基本运算符与流程控制

    目录 基本运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 身份运算符 位运算符 成员运算符 运算符优先级 流程控制 if 判断 单分支结构 双分支结构 多分支结构 while 循环 while ...

  10. [洛谷P2472] [SCOI2007]蜥蜴

    题目链接: 蜥蜴 题目分析: 一道网络流,先来分析一下问题: 在一个\(r*c\)的图中分布了一些数,其他地方都用\(0\)填充,我们分别从指定的一些数出发,每次可以移动到周围距离为\(d\)以内的数 ...