廖雪峰Java12maven基础-2maven进阶-1使用插件
1.maven的Lifecycle,Phase和Goal:
- 使用maven构建项目就是执行Lifecycle
- 执行Lifecycle就是按顺序执行一系列Phase
- 每执行一个Phase,都会执行该Phase绑定的若干Goal
- Goal是最小任务单元
2.maven通过调用不同的插件Plugin来构建项目的。
mvn compile:执行compile这个Phase时,maven本身并不知道如何执行compile。它是通过插件来执行。maven会调用compiler插件执行compile这个Phase。compiler插件会执行和compile关联的compiler:compile这个Goal来完成编译。
3.maven常用的标准插件
插件名称 | 对应执行的Phase |
---|---|
clean | clea |
compiler | compile |
surefire | test |
jar | package |
常用插件:
- maven-shade-plugin:打包所有依赖包并生成可执行jar
- cobertura-maven-plugin:生成单元测试覆盖率报告
- findbugs-maven-plugin:对Java源码进行静态分析以找出潜在问题
如果标准的插件无法满足需求,还可以自定义插件
3.1maven-shade-plugin
例如:想要创建1个可执行的jar包,同时把所有可依赖的jar包都打包到自己最终生成的jar包中。此时我们需要在pom.xml中声明自定义的plugin。注意maven自带的标准插件比如compile是无须声明的,只有当我们加入了其他的插件才需要声明。
百度搜索maven shade plugin executable jar,进入其官网,查看示例
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.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>org.sonatype.haven.HavenCli</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
进入工程,修改pom.xml,在标签后新建,并将示例中的之间的内容复制到之间
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.forme</groupId>
<artifactId>OneWorld</artifactId>
<version>1.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>OneWorld</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version><!--JDK1.8-->
<maven.compiler.source>1.8</maven.compiler.source><!--Java源码使用1.8格式-->
<maven.compiler.target>1.8</maven.compiler.target><!--编译后的class文件采用1.8格式-->
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.10.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--此处需要指定main方法所在class-->
<mainClass>com.forme.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
App.java
package com.forme;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
Log log = LogFactory.getLog(App.class);
log.info("Hello,world!");
}
}
AppTest.java
package com.forme;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertTrue( true );
}
}
目录结构
命令行打包成功
#切换到工程根目录,打包
mvn clean package
#进入target目录,查看jar文件
ls -lh *jar
可以看到有2个jar包
original-OneWorld-1.1-SNAPSHOT.jar是maven自己的jar插件生成原始的jar包
OneWorld-1.1-SNAPSHOT.jar是由maven-shade-plugin生成的可执行的jar
```#shell
java -jar OneWorld-1.1-SNAPSHOT.jar
```
这样,可以方便的通过maven-shade-plugin生成可执行的jar
3.2 cobertura maven plugin usage
搜索cobertura maven plugin usage,进入官网
<project>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<reportSets>
<reportSet>
<reports>
<report>cobertura</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
3.2.1 初识cobertura
将...之间的内容复制到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.forme</groupId>
<artifactId>OneWorld</artifactId>
<version>1.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>OneWorld</name>
<!--FIXME change it to the project's website-->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version><!--JDK1.8-->
<maven.compiler.source>1.8</maven.compiler.source><!--Java源码使用1.8格式-->
<maven.compiler.target>1.8</maven.compiler.target><!--编译后的class文件采用1.8格式-->
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.10.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--此处需要修改main函数所在类-->
<mainClass>com.forme.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</build>
</project>
App.java
package com.forme;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
Log log = LogFactory.getLog(App.class);
log.info("Hello,world!");
}
//增加一个求和的方法
int sum(int ... ns){
int x = 0;
for(int n:ns){
x += n;
}
return x;
}
}
AppTest.java
package com.forme;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertEquals(6,new App().sum(1,2,3));
}
}
#切换到项目的根目录
mvn cobertura:cobertura
进入target/site/cobertura目录下,打开index.html,可以查看结果
#### 3.2.2 main方法未执行,完善测试覆盖率
```#java
package com.forme;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
- Unit test for simple App.
/
public class AppTest
{
/*- Rigorous Test
廖雪峰Java12maven基础-2maven进阶-1使用插件的更多相关文章
- 廖雪峰Java12maven基础-2maven进阶-2模块管理
1. 把大项目拆分为模块是降低软件复杂度的有效方法 在Java项目中,我们通常会会把一个项目分拆为模块,这是为了降低软件复杂度. 例如:我们可以把一个大的项目氛围module-a, module-b, ...
- 廖雪峰Java12maven基础-1maven入门-1maven介绍
1.Java项目: * 1.1.首先确定引入哪些依赖包,如commons-logging, log4j, selenium * 1.2.确定项目的目录结构 * 1.3.配置环境:如JDK的版本号 * ...
- 廖雪峰Java12maven基础-1maven入门-3构建流程
maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...
- 廖雪峰Java12maven基础-1maven入门-2依赖管理
maven 如果我们的项目依赖第三方的jar包: Commons Logging发布的jar包在那里下载? 使用Log4j需要哪些jar包 其他依赖:junit,Javamail,MySQL驱动... ...
- phython廖雪峰
这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ...
- 【学习总结】Git学习-参考廖雪峰老师教程六-分支管理
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- 《廖雪峰 . Git 教程》学习总结
基本上,Git就是以下面的命令顺序学习的.文中笔记是从廖雪峰老师的 Git教程 中总结出来的,方面查阅命令. 1.基础 git config --global user.name "Your ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- python语言特性-------python2.7教程学习【廖雪峰版】(一)
开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活. 2.Python是一种相当高级的语言. ...
随机推荐
- jpa简单规则(转https://www.cnblogs.com/rulian/p/6434631.html)
一.常用规则速查 1 And 并且2 Or 或3 Is,Equals 等于4 Between 两者之间5 LessThan 小于6 LessThanEqual 小于等于7 Gre ...
- Python3实用编程技巧进阶✍✍✍
Python3实用编程技巧进阶 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...
- python中字典排序
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
- 码云的使用以及pycharm
码云的使用 下载Git一路next 在码云上新建仓库 建立码云仓库 右键 git bash hero 依次输入 git config --global user.name "用户名&qu ...
- <爬虫实战>糗事百科
1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...
- 2018今日头条湖北省赛【D】
[题目链接]https://www.nowcoder.com/acm/contest/104/C 不知道这题为啥没过.队友现场推的都是对的..233333好像代码写的有问题,下来就很恼火. 题意大概就 ...
- axios 基本运用
axios是专门对ajax请求进行封装的一个插件,其返回一个promise对象,用法跟ES6的promise很相似 一.安装axios插件npm install axios 二.引入axios插件 在 ...
- java 数组中的数值反转输出
package com.test; /** *数组元素反转 * */ public class ArraySwap { public static void main(String[] args) { ...
- Git查看历史记录的几种方法
- VS环境下,DEV插件的ComboBoxEdit控件最简单的数据源绑定和获取方法
使用 ComboBoxEdit 控件绑定key/value值: 因为 ComboBoxEdit 没有 DataSource 属性,所以不能直接绑定数据源,只能一项一项的添加. 首先创建一个类ListI ...
- 廖雪峰Java12maven基础-2maven进阶-2模块管理
- Rigorous Test