2019独角兽企业重金招聘Python工程师标准>>>

POM是什么?

1、像Make的Makefile、Ant的build.xml一样,Maven项目的核心是pom.xml

2、POM (Project Object Model, 项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等

如何编写一个Hello World的POM?

新建一个名为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.juvenxu.mvnbook</groupId>

<artifactId>hello-world</artifactId>

<version>1.0-SNAPSHOT</version>

<name>Maven Hello World Project</name>

</project>

对楼上的配置进行解释

1、代码的第一行是XML头,指定了该xml文档的版本和编码方式

2、紧接着的project元素,project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素(虽然这些属性不是必须的,但使用这些属性能够让第三方工具,如IDE中的XML编辑器,帮助我们快速编辑POM)

3、根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0

4、最重要的groupId、artifactId和version,这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的

groupId是什么意思?

groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,比如在googlecode上建立了一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp

artifactId是什么意思?

artifactId用于定义该项目下的某个模块,比如myapp-util、myapp-domain、myapp-web等

version是什么意思?

version指定了Hello World项目当前的版本——1.0.SNAPSHOT

SNAPSHOT是什么意思?

SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0、1.1-SNAPSHOT、1.1、2.0等

最后的是name是什么意思?

最后的name元素声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流

Maven中的项目主代码和测试代码分别是指?

1、项目的主代码会被打包到最终构建中(如jar)

2、项目的测试代码只在运行测试时用到,不会被打包

3、默认情况下,Maven假设项目主代码位于src/main/java目录,测试代码位于src/test/java

关于Java代码有两点需要注意

1、应该把项目主代码放到src/main/java目录下(遵循Maven的约定),而无需额外的配置,Maven会自动搜寻该目录找到项目主代码

2、该Java类的包名是com.juvenxu.mvnbook.helloworld,这与之前在POM中定义的groupId和artifactId相吻合,一般来说,项目中Java类的包都应该基于项目的groupId和artifactId,这样更加清晰、更加符合逻辑,也方便搜索构件或者Java类

在项目根目录下运行命令 mvn clean compile

1、clean命令告诉Maven清理输出目录target,就是删除target目录

2、compile命令告诉Maven编译项目主代码

3、默认情况,Maven构建的所有输出都在target/目录中,compile任务将项目主代码编译至target/classes目录,(target\classes\com\juvenxu\mvnbook\helloworld\HelloWorld.class)

4、执行任务顺序是: clean:clean任务、resources:resources任务、compile:compile任务,resources任务是处理项目资源(src/main/resources、src/test/resources)

上面提到的clean:clean、resources:resources、compile:compile是指?

格式应该是:插件:插件目标

比如clean:clean是clean插件的clean目标,以此类推

引入JUnit依赖

在Java世界中,由Kent Beck和Erich Gamma建立的Junit是事实上的单元测试标准,要使用JUnit,首先需要为Hello World项目添加一个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/maven/-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.juvenxu.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>

</project>

对上面配置进行解释

1、配置中添加了dependencies元素,该元素下可以包含多个dependency元素

2、添加junit坐标,Maven自动下载junit-4.7.jar

3、scope元素指的是依赖范围

依赖范围是指?

1、若依赖范围为test表示该依赖只对测试有效,换句话说,测试代码中import JUnit代码是没问题的,但是如果在主代码中用import JUnit代码,就会造成编译错误。

2、若不声明依赖范围,那么默认值就是compile,表示该依赖对主代码和测试代码都有效

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

1、准备测试类及数据

2、执行要测试的行为

3、检查结果

另外JUnit3中,约定所有需要执行测试的方法都以test开头,JUnit4中,测试方法都以@Test 进行标注

执行mvn clean test
执行该命令会依次执行如下任务:

任务名

插件和版本号

Clean

Maven-clean-plugin:2.5

Resources

Maven-resources-plugin:2.6

Compile

Maven-compile-plugin:2.5.1

testResources

Maven-resources-plugin:2.6

testCompile

Maven-compile-plugin:2.5.1

Test

Maven-surefire-plugin:2.12.4

之后就是Surefire report directory: target\surefire-reports

执行测试,测试完成后会在target\surefire-reports下生成测试报告,一个.txt文件一个.xml文件,测试报告显示一共运行了多少测试,失败多少,出错了多少,跳过了多少

打包和运行 mvn clean package

1、默认打包类型jar,会执行jar:jar任务

2、将主代码打包成hello-world-1.0-SNAPSHOP.jar

3、也可以使用finalName来自定义该文件的名称

如何让其他的Maven项目直接引用自己的jar? mvn clean install

1、执行安装任务install:install

2、将该项目的pom和jar安装到本地仓库,便于其他maven项目引用

直接使用mvn clean install命令打包的jar文件无法直接执行,虽然有main方法

因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Class一行)

那么如何解决jar文件有main方法但是不能执行这一问题

为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-shade-plugin</artifactId>

<version>1.2</version>

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>shade</goal>

</goals>

<configuration>

<transformers>

<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>

</transformer>

</transformers>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>

plugin元素在POM中的相对位置应该是<project> <build> <plugins>下面

配置<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>,项目在打包时会将该信息放到MANIFEST中

现在执行mvn clean install

在target目录下会生成两个jar:

hello-world-1.0-SNAPSHOT.jar,可执行的jar

orginal-hello-world-1.0-SNAPSHOT.jar,原始的jar

打开hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到如下这样一行信息: Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld

现在,在项目根目录下执行: java -jar original-hello-world-1.0-SNAPSHOT.jar 结果是:Hello Maven

转载于:https://my.oschina.net/u/814431/blog/355105

Maven实战读书笔记(3)相关推荐

  1. [原创]Maven实战-读书笔记

    Maven读书笔记  Maven读书笔记 依赖 快捷键:Alt+Shift+X M 使用ArcheType来创建Maven项目骨架: Maven中坐标的定义 依赖范围 依赖传递 依赖调解 可选依赖 ...

  2. Maven实战读书笔记(六):Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...

  3. Maven实战读书笔记1

    Maven第一章 何为Maven 何为构建 何为Maven Maven翻译为:知识的累积,专家,内行.是Apache组织中成功的一个开源项目.主要服务于基于Java平台的项目构建.依赖管理和项目信息管 ...

  4. maven实战--读书笔记之第一章和第二章

    第一章:Maven简介 1.本书为国内社区公认的专家徐晓斌所写,本书基于maven3.0所编写,maven是非常优秀的建模工具,maven最大化的消除了构建的重复,抽象了构建生命,他还有一个优点,帮助 ...

  5. Spring4实战读书笔记

    Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...

  6. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  7. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...

  8. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

  9. Apache Kafka实战读书笔记(推荐指数:☆☆☆☆☆)

    Apache Kafka实战读书笔记(推荐指数:☆☆☆☆☆) 认识AK 快速入门 安装和启动 小案例 消息引擎系统 消息引擎范型 AK的概要设计 吞吐量/延时 消息持久化 负载均衡和故障转移: 伸缩性 ...

最新文章

  1. 将一个普通的java项目转化为maven项目
  2. MVC3----筛选数据(BeginForm:输出form表单)
  3. 华为机器狗 VS 波士顿狗,谁更胜一筹?
  4. shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中
  5. 英特尔收购人工智能公司 Nervana,开发深度学习技术
  6. 第二章 DateTime工具类
  7. 猿辅导的python课_每天自学俩小时Python,改变命运足矣
  8. iis5.1配置php运行环境
  9. 操作系统概念第七章部分作业题答案
  10. 测试 tolua 例子 TestErrorStack
  11. 25项工程师必备技能 学习理论/学习曲线
  12. 显示风场的某一局部区域,实现多分辨率
  13. PPT中放射发散型的文字效果设计技巧
  14. oracle驱动包下载
  15. php夜间时间模式,Typecho夜间模式设置
  16. 胡喜:从 BASIC 到 basic ,蚂蚁金服技术要解决两个基本的计算问题
  17. 计算机底层:CPU结构与组成原理、工作原理
  18. JSCharting JavaScript 3.3.X 12/17/2022 Crack
  19. 计算机网络时间校时,若当前系统时间与标准时间误差在( )分钟内,需进行校准。出处:《计算机化系统时钟校准管理规程》MS-E050。...
  20. 面条html5,10道超简单又好吃的面条做法!营养,美味,早起5分钟就能把早餐做好...

热门文章

  1. 郑州轻工业学校计算机网络,计算机网络期末考试a卷(郑州轻工业学院).doc
  2. 寻找中项和第k小元素c语言,分治法第k小元素poj2104.ppt
  3. php布尔类型代码,PHP数据类型之布尔型的介绍
  4. java中json对象去重复_如何忽略Java中JSON对象的多个属性?
  5. werkzeug response
  6. jinja Macros
  7. Python __add__
  8. C++ 输入和输出IO
  9. 3.2 为超参数选择合适的范围
  10. 32乘法运算_算术运算指令