本人从事JAVA编程已经有一些年月了(咳咳咳咳咳~喝一口茶),基本上在每次的项目开发过程当中都会使用一些集成工具,好比说Maven或是Gradle。最近在写一个项目,可是项目在打包的过程当中出现了问题,对把MAVEN一直看成傻瓜工具来使用的我彻底不知道如何去解决这些问题。因此如今我想从新来了解一下这个工具,并用一种通俗易懂的方式来解释这个工具的用意。html
本教程适用于如下两种人:java
这里欢迎全部人对文中的问题提出质疑,你们的意见笔者将很是珍惜!程序员
安装MAVEN
官网上给出了六个单词做为MAVEN的用途,分别是web
这几个词乍一看来什么都没表述。那么我就用一些具体的例子来讲明。面试
对于初次接触JAVA的同窗来讲,在Eclipse中写一个类,其中包含一个main方法,而后点击一下运行键,就能够将代码运行起来。
可是,真实世界中的项目每每十分复杂,首先,一个项目会有一个开发过程的生命周期,其中和程序员紧密相关联的步骤包括:开发,测试,集成,打包,部署。而在这些过程当中,每每须要众多的程序员齐心合力完成,一个步骤可能有多个程序员并行的进行实现。更麻烦的是,在迭代开发过程当中,每每会产生多个版本的产品,这些版本之间既具备共同性,又具备差别性。如何才能将各个版本进行有效的管理呢?不只如此,在各个不一样的开发时期,每每伴随着人员的调动,一个新入组的程序员如何才能更快的对项目进行了解从而投入工做呢?apache
这就引来了一个问题,如何才能保证每一个程序员的工做成果对彼此可见,从而使每一个人之间的合做更加流畅,而不是产生冲突和冗余。编程
MAVEN就此而生。它更像是达成的某种共识。你们按照这种共识进行程序的开发。MAVEN定义了一系列开发规范,好比包的命名和功能,项目的命名等等。MAVEN中还实现了许多功能,好比自动构建,自动对依赖进行管理,自动生成项目文档等。在MAVEN的帮助下,开发人员能够尽量的专一于代码的编写,而不是去写冗长的项目说明文档,或是进行重复的项目构建和复杂的配置管理。微信
MAVEN本质上是一个终端工具,可是不少IDE(集成开发环境)都配有MAVEN插件,所以不少人在初次接触MAVEN使都会使用图形工具操做它。这样并不有利于学习MAVEN。建议你们之后尽可能使用命令行来操控MAVEN,在熟练之后再使用图形化工具。app
先打开终端(CMD或TERMINAL)进入项目目录后输出如下指令:webapp
mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=com.mycompany.app \ -DartifactId=my-app
这个指令声明了项目的名称(artifactId),项目所属的组织(groupId),以及项目初始化时使用的maven模板。
第一次使用MAVEN建立项目会比较慢,由于它会初始化一些内容。
执行完毕后会产生以下如所示的目录结构,其中根目录名称为artifactId的值(在这里是my-app)。
具体状况以下:
在这里咱们简单介绍一下根目录下各个组件的用途。
注:${basedir}是指项目的根目录,好比在个人电脑上就是/users/rale/my-app
${basedir}/src/main/java
:这个目录下放置了项目的源代码,其中按照初始化时groupId的属性建好了包,每一级域名对应一个文件夹。这是MAVEN默认的建包规范。
${basedir}/src/main/java
:这个目录下放置了项目的测试代码,而且在项目打包的时候不会被装入包中。这个目录底下的文件夹格式和main底下的文件夹格式相同。
pom.xml
:这个文件能够说是MAVEN的核心文件,在下面详细说明。
初始化后的pom文件内容以下。
<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.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
在pom中包含了当前项目管理的所有信息。pom文件采用XML的格式存储项目的配置信息(对于XML文件不熟悉的童鞋能够自行百度,这篇文章就不详细描述其语法了)。先简单介绍一下上图这个简单的pom文件中的内容:
project
: XML文件中的顶层元素
modelVersion
: POM采用的模型的版本,这个元素不多改动
groupId
: 开发这个项目的组织的惟一的标识号,通常采用域名的倒序
artifactId
: 这个项目产品的名称
packaging
: 打包的格式
version
: 打包出来的版本
name
: 项目的展现名称,一般用于MAVEN生成的文档中
url
: 项目的网址,一般用于MAVEN生成的文档中
description
: 项目的基本描述,一般用于MAVEN生成的文档中
此时maven生成的App.java文件中有一个自动实现好的hello world实例,咱们能够直接编译项目并运行。
在项目的根目录下执行mvn test
,maven会自动生成对应的.class文件位于${basedir}/target/classes
目录下而且执行测试。能够看到下图的输出结果中说明一共一个测试用例,而且没有失败的测试用例。
以后使用指令mvn package
打包,打包生成的文件默认路径为${basedir}/target
。
至此咱们已经完成了MAVEN的最基本操做。
这里给出了添加MAVEN编译器插件的例子。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
Maven中的插件能够附着在编译过程的不一样的声明周期。一共能够分为两种类型的插件,一种是用于编译的插件,一种是用于生成报告的插件。编译的插件应当声明于<build>模块,而报告的插件应当声明于<reporting/>模块
全部的插件须要至少三个信息,groupId, artifactId和version
对于每一个插件再在本身的configuration标签下详细定义。
关于plugin更多内容请参考这个网址
这里给出了添加Junit依赖的例子
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
添加一个Dependency至少须要声明四个属性:groupId, artifactId, version, 和scope。其中scope是指在编译的哪一个阶段使用该依赖,其值能够为compile test和runtime
。
默认状况下,全部的依赖文件都位于${user.home}/.m2/repository
目录下。Maven会将不在本地的依赖下载至这个目录,而且在项目中指向这个依赖。
这里可能会对Plugin和Dependency这两个概念之间产生一些困惑,彷佛两者都是经过引用外部的工具完成当前项目的开发。可是这两个实际上是彻底不一样的两个概念。
插件会绑定到指定的生命周期上,在特定的生命周期上触发。咱们不会使用插件协助咱们编程。
可是依赖是指咱们会使用依赖的文件帮助开发,例如鼎鼎有名的JUnit
。咱们会使用里面的部分功能进行再次编码开发。
首先,咱们须要知道的是,pom文件是能够继承的。也就是说,咱们能够有父pom文件和多个子pom文件。目录格式以下:
+- pom.xml +- my-app | +- pom.xml | +- src | +- main | +- java +- my-webapp | +- pom.xml | +- src | +- main | +- webapp
在父pom中应当声明以下语句,将各个模块添加进来
<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.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>my-app</module> <module>my-webapp</module> </modules> </project>
由于my-webapp须要my-app的依赖,所以在my-webapp/pom.xml文件中添加以下语句
<dependencies> <dependency> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> </dependency> ... </dependencies>
最后在my-webapp/pom.xml和my-app中都添加以下语句继承父pom文件
<parent> <groupId>com.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> </parent>
最后在项目的总根目录执行mvn verify
能够看到项目开始一块儿编译
mvn archetype:create -DgroupId=packageName -DartifactId=projectName
:建立一个普通的MAVEN项目
mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp
: 建立一个MAVEN的web应用
mvn compile
:编译源代码
mvn test
: 执行测试
mvn test-compile
: 编译源代码和测试代码
mvn package
: 将项目打包成packaging
标签下声明的格式,在这里是JAR格式。默认状况下,生成的JAR包位于${basedir}/target
目录下。
mvn compile
:
mvn clean
: 清除以前的编译结果,直观的来看就是删除${basedir}/target
文件夹
mvn site
: 自动生成项目简介的网站
mvn verify
:运行任何检查,验证包是否有效且达到质量标准
本文还将持续更新~~~
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注个人微信公众号!将会不按期的发放福利哦~