内容简介: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入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Filter Bubble
Eli Pariser / Penguin Press / 2011-5-12 / GBP 16.45
In December 2009, Google began customizing its search results for each user. Instead of giving you the most broadly popular result, Google now tries to predict what you are most likely to click on. Ac......一起来看看 《The Filter Bubble》 这本书的介绍吧!