内容简介:Maven的默认POM文件,如果POM文件没有指定父POM文件,那么配置都是集成Super POMMaven项目的完全限定名:
Maven
What is Maven?
- 构建规范项目的工具
- 项目管理工具,进行打包,测试,部署
- 具有一套规范
POM
What is POM
- Maven的基本工作单元
- xml文件
- 存储Maven项目的配置文件(Maven的命令都是先从POM读取命令,然后执行命令)
Super POM
Maven的默认POM文件,如果POM文件没有指定父POM文件,那么配置都是集成Super POM
Minimal POM
POM文件的最低需要的配置元素:
- project
- groupId:一般是组织名称
- artifactId:项目的名称
- version:项目的版本号
Maven项目的完全限定名:
groupId:artifactId:version
packaging元素默认是JAR,还有其他选项是WAR,EAR等等
Project Inheritance
之前在Super POM一节谈到指定了父POM的继承指定父POM的配置,实现如下:
. |--my-app | |-- my-module | | `-- pom.xml `-- pom.xml
my-app的POM <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </project>
my-module的POM <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version> </project>
修改my-module的POM,即可实现讲my-app作为一个父POM继承给my-module,实现如下:
my-module的POM
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
如果my-app不是作为my-module的父目录,如下:
.
|-- my-module
| `-- pom.xml
`-- my-app
`-- pom.xml
需要配置<relativePath>属性,配置相对my-module的相对路径如下:
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>
Project Aggregation
如果我们想要对一些模块都需要执行相同的命令,但是不想进入每一个模块下进行执行命令,可以使用Aggregation.
目录结构
. |-- my-module | `-- pom.xml `-- pom.xml
将my-module模块聚合到my-app,修改my-app的POM文件如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
- <packaging>属性设置未pom
- <module>属性是相对于my-app的相对路径
- 有些命令不能同时执行
- Inheritance和Aggregation可以混合使用
Project Interpolation and Variables
Maven的设计哲学就是不要重复自己,所以当一些配置是相同的时候,我们可以使用自己定义的变量和预定义好的变量.
比如我们要使用projcet的version给其他配置项,我们可以如此使用
<version>${project.version}</version>
我们也可以使用自己定义的变量,比如我们定义了一个mavenVersion变量,我们可以如此使用
<project>
...
<properties>
<mavenVersion>2.1</mavenVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>
Standard Directory Layout
我们在思考Maven是什么的时候,其中有一个理解就是Maven是一套规范,那么这些规范体现在哪里呢,体现在他的项目目录的结构
| 目录 | 解释 |
|---|---|
| src/main/java | Application/Library sources |
| src/main/resources | Application/Library resources |
| src/main/filters | Resource filter files |
| src/main/webapp | Web application sources |
| src/test/java | Test sources |
| src/test/resources | Test resources |
| src/test/filters | Test resource filter files |
| src/it | Integration Tests (primarily for plugins) |
| src/assembly | Assembly descriptors |
| src/site | Site |
| LICENSE.txt | Project's license |
| NOTICE.txt Notices | and attributions required by libraries that the project depends on |
| README.txt | Project's readme |
Compile
- 编译主代码(即是除去测试代码)
命令:
mvn compile
- 切换目录到需要执行编译的项目的pom.xml文件目录下
- 首先Maven先去下载编译需要的插件和依赖
- 将编译的文件放在 ${basedir}/target/classed
- 编译测试代码
命令:
mvn test-compile
- 该命令不会进行测试
Test
命令:
mvn test
- 如果没有执行mvn compile命令编译,则会先进行编译。
- 同时也需要下载测试需要的插件
install
我们执行编译的或者测试的时候会将需要依赖下载到本地仓库(一般在${user.home}/.m2/repository)中,供我们的项目使用。那么我们是不是也可以讲自己的项目给其他项目使用呢?
- 先打包
- 后安装
Packaging
命令:
mvn packaging
该命令会将打包好的文件(如果我们在POM文件设置packaging是jar,那就打成jar包,以此类推)放在目录${basedir}/target
Install
命令:
mvn install
surefire插件会查找项目中特定命名约定的文件
- **/*Test.java
- **/Test*.java
- **/*TestCase.java
默认排除:
- **/Abstract*Test.java
- **/Abstract*TestCase.java
Clean
命令:
mvn clean
只将${basedir}/target里面的文件清除
External Dependencies
命令:
<dependencies>
...
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
- groupId,artifactId,version就是我们一开始所说的项目的定位必备三项。
- scope代表在何时使用一般有个compile(编译),test(测试),runtime(运行)
- 那么我们引用的这些第三方的库从哪里下载呢?从我们repository属性配置
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
你不知道的JavaScript(上卷)
[美] Kyle Simpson / 赵望野、梁杰 / 人民邮电出版社 / 2015-4 / 49.00元
JavaScript语言有很多复杂的概念,但却用简单的方式体现出来(比如回调函数),因此,JavaScript开发者无需理解语言内部的原理,就能编写出功能全面的程序;就像收音机一样,你无需理解里面的管子和线圈都是做什么用的,只要会操作收音机上的按键,就可以收听你喜欢的节目。然而,JavaScript的这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发者,如果没有认真学习也无......一起来看看 《你不知道的JavaScript(上卷)》 这本书的介绍吧!