JAVA学习之maven的使⽤
场景:最近使⽤springboot写⼀些⼩demo,发现到处都要使⽤maven,更离不开其中的l⽂件,所以这⾥对maven的常规使⽤作出⼀个整理。
⽂章结构:
1. 安装配置maven环境
2. maven⽬录结构
3. HelloMaven
4. 常⽤构建命令
5. 使⽤archetype插件⾃动建⽴⽬录
6. 坐标&仓库
7. ⽣命周期&插件的使⽤
8. l常⽤标签介绍
9. maven依赖(范围、传递、冲突)
10. 聚合&继承
正⽂:
1. 安装配置maven环境
⾸先,在中下载maven组件。进⼊官⽹后,在左边菜单到Download选项,点击进⼊Download页⾯。
当然,我们⾸先要保证JDK安装好。接下来,要在本地配置好maven的系统环境变量,
新建⼀个maven_home的变量,然后在系统变量的path后⾯追加这个maven_home;
接着,我们测试下maven安装成功没有(注意,⼀般我们都先安装好JDK,因为maven的命令应该是要借助jdk的):
如图所⽰,显⽰了maven的版本信息跟jdk的版本信息,当然,我们也可以使⽤echo 查看下系统环境变量:
到这⾥,我们对maven的环境配置就完成了。其实这是第⼀种,我们下载jar包的形式,不过本⼈是使⽤第⼆种,直接安装eclipse(包含maven)的版本即可,
⽐如我安装的版本即是⾃带的maven;接下来只需要配置好本地的系统变量即可。
诶,如果我们想要改变maven的版本呢,我们可以在eclipse当中的preferences当中改变:
2.  maven项⽬的⽬录结构
先在这⾥插⼊⼀点个⼈对maven的理解,我们之前每个项⽬都需要有⾃⼰的jar包,但是这么多jar包很多有相同的,⽽这些jar包⼜是基于项⽬存放的,如果我们跨越项⽬
这⼀层,统⼀管理jar包呢,这样不就可以节约很多空间和时间。所以,我们使⽤maven⼯具来⽀配之,那么我们maven存放jar包的地⽅就是我们说的仓库,
当我们在第⼀步设置好maven的环境之后,默认就在c盘的user⽬录下的.m2⽂件夹充当仓库。
a
maven在每台机器上创建⼀个本机仓库,把本机上所有maven项⽬依赖的jar包统⼀管理起来,⽽且这
些jar包⽤“坐标”来唯⼀标识(注:坐标是另⼀个重要的概念,后⾯还会讲到,这⾥只要简单理解成“唯⼀识别某个jar包⽂件名、版本号”的标识即可),这样所有maven项⽬就不需要再象以前那样把jar包复制到lib⽬录中,整个maven项⽬看起来⼗分清爽。
扯了很多,现在说下maven项⽬的⽬录结构是怎样的:
诶,这些有些怎么标红呢?是因为我们使⽤maven约定由于配置。src/main/java约定⽤于存放源代码,src/main/test⽤于存放单元测试代码,src/target⽤于存放编译、打包后的输出⽂件。这是全世界maven项⽬的通⽤约定,请记住这些固定的⽬录结构。
3. 构建⼀个HelloMaven项⽬
上⾯介绍完了我们该使⽤怎样的约定来开发⼀个项⽬,接下来我们创建⼀个项⽬。
new⼀个maven项⽬,写好坐标(待会介绍)。这⾥说的坐标就是上⾯的groupid以及artifact id。创建好之后的结构如下图所⽰:
接下来我们尝试编译下这个项⽬,命令⾏进⼊项⽬路径,使⽤mvn compile命令(当然,直接在eclipse上run as这个项⽬使⽤maven的⼏个选项都是可以的)。编译之后会⽣成target⽬录,⾥⾯存放的是class⽂件:
我们接下来编译下:
我们查看下项⽬⽬录:
我们这⾥在maven项⽬的测试类中写个syso输出:
OK,我们再在控制台输⼊mvn clean ,清理下class⽂件,再输⼊mvn compile 再次编译⼀下,接着输⼊mvn test执⾏AppTest.class⽂件:
我们可以看到已经输出成功了。
4. 常⽤构建命令
从第3步骤可以看出,这些命令的使⽤了,其实很像使⽤java命令编译对不对。那么我们来介绍下maven的这些构建命令:其形式⼀般都是在命令⾏ mvn xxx的这种格式:
mvn    {
-v 查看maven版本以及其他相关信息
      compile 编译maven项⽬,并⽣成target⽂件夹
      test 运⾏test⽬录下的测试⽂件,即测试
      package 将项⽬打包,默认打包为jar格式,也可以打包成war格式⽤于服务器运⾏
install 将打包的jar⽂件安装到maven本地仓库
clean 删除target,相当于清除缓存
}
这些命令在集成了maven的eclipse当中也有对应选项可以操作:
我们可以右键⼀个项⽬,然后run as 就会出现这些选项,在下⾯的maven当中还有update选项;
maven打包本地jar包
那这么多命令,我们怎么知道怎么合理使⽤呢,其实我们只需要理解到整个项⽬的构建过程就可以明⽩这⼀点了:
项⽬构建过程包括【清理项⽬】→【编译项⽬】→【测试项⽬】→【⽣成测试报告】→【打包项⽬】→【部署项⽬】这⼏个步骤,这六个步骤就是⼀个项⽬的完整构建过程。(mvn clean  -> mvn compile  -> mvn test -> mvn package)
⽽上⾯所说的maven update是针对我们在项⽬中的l当中引⼊了新的jar包之后,需要重新update⼀下,此处的应⽤场景就是:
⽐如我们A项⽬在l引⼊了⼀个新包,这个时候我们需要把A项⽬重新update⼀下才能使⽤新jar包当中的东西(不过很多时候我们项⽬有⾃动重构);如果这个时候我们B项⽬引⽤了A,也想使⽤这个新jar包,我们也应当update⼀下,避免发⽣引⽤错误,还有⼀个常见的使⽤场景就是我们import⼀个新的maven聚合项⽬的时候,需要clean install :
然后我们还要update把jar包下下来,这个时候如果依赖包过多,其下载是相当⼤的,所以我们可以指定maven仓库的位置为阿⾥的(更改setting⽂件后⾯作出介绍。)
下⾯我列举⼀下常⽤的maven 命令(注意我上⾯在eclipse当中不是maven clean ⽽是clean,原因吗我也不知道啦):
创建⼀个简单的Java⼯程:mvn archetype:create -ample -DartifactId=Example
创建⼀个java的web⼯程:mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -pany.app -DartifactId=my-webapp
打包:mvn package
编译:mvn compile
编译测试程序:mvn test-compile
清空:mvn clean
运⾏测试:mvn test
⽣成站点⽬录: mvn site
⽣成站点⽬录并发布:mvn site-deploy
安装当前⼯程的输出⽂件到本地仓库: mvn install
安装指定⽂件到本地仓库:mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
查看实际pom信息: mvn help:effective-pom
分析项⽬的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
跳过测试运⾏maven任务:    mvn -st.skip=true XXX
⽣成eclipse项⽬⽂件: mvn eclipse:eclipse (将maven项⽬转换成eclipse项⽬)
查看帮助信息:mvn help:help 或 mvn help:help -Ddetail=true
查看插件的帮助信息:mvn <plug-in>:help,⽐如:mvn dependency:help 或 mvn ant:help 等等。
这⾥我还想多说⼀点,其实maven的功能不仅仅是这样,如下我列举⼀些maven的常⽤基本功能 :
构建:⽐如⽣成class、jar、war或者ear⽂件
⽣成⽂档:⽐如⽣成javadoc、⽹站⽂档
⽣成报告:⽐如junit测试报告
⽣成依赖类库:⽣成⽂档,说明项⽬多其他软件的依赖
有关SCM:SCM(Software Configuration Management),软件配置管理,⽐如版本控制,⽐如bug管理等等
发布:⽣成供发布的分发包,⽐如⽣成Struts2的分发包,供提交给⽤户使⽤
部署:⽐如,web应⽤程序,⾃动部署到指定的服务器上
见;
,官⽅简易⼊门⽂档;
,官⽅⼊门⽂档;
,官⽅的cookbook;
,POM⽂件的设置参考
,settings⽂件的设置参考
,免费的电⼦书,下载需要注册。
5.使⽤archetype插件⾃动建⽴⽬录
这个本⼈不作出介绍了,哈哈,没⽤过。
6. 坐标和仓库
   maven使⽤groupId、artifactId、version表⽰坐标,每个坐标都唯⼀的指向⼀个maven项⽬,简单介绍⼀下这⼏个标签
      groupId:项⽬组织唯⼀的标识符,⼀般为反写的公司⽹址+项⽬名
      artifactId:项⽬的唯⼀的标识符,⼀般为项⽬名+模块名
      version:版本号 x.x.x+版本类型
        第⼀个x表⽰⼤版本号
        第⼆个x表⽰分⽀版本号
        第三个x表⽰⼩版本号(可省略)
        常见版本类型:
          snapshot快照
          alpha内部测试
          beta公测
          release稳定
          GA正式发布
      注:包名应与groupId+artifactId相吻合。
仓库: maven的依赖管理是靠着仓库来⽀撑的,仓库分为中央仓库和本地仓库。在编译项⽬时,maven会根据配置的依赖,现在本地仓库中进⾏搜索,若是没有则再去仓库进⾏搜索,⽽搜索便是采⽤坐标进⾏查。仓库默认为本地的c盘users⽂件夹下⾯的.m2的repository。如果不想放在C盘的话,可以对maven进⾏配置:
如图,可以⾃⼰重写localRepository;
7. ⽣命周期 & 插件的使⽤
多个⽣命周期之间相互独⽴。每个⽣命周期含有多个阶段,阶段按顺序执⾏,运⾏后阶段时,前阶段
会⾃动执⾏。⽐如,直接运⾏mvn test命令,那么执⾏该命令时,会⾃动的附带mvn compile命令,因为test阶段在compile阶段之后。
上⾯我们就说过,⼀个完整的项⽬的构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署;
clean 清理项⽬,包括以下阶段:
      pre-clean 执⾏清理前
      clean 清理上⼀次构建⽣成的所有⽂件
      post-clean 执⾏清理后的⽂件
    default 构建项⽬(核⼼:常⽤),包括以下阶段
      compile 编译
      test 测试
      packeage 打包
      install 安装
    site ⽣成项⽬站点,根据pom中信息⽣成项⽬站点,包括以下阶段
      pre-site 在⽣成项⽬站点前要完成的⼯作
      site⽣成项⽬的站点⽂档
      post-site在⽣成项⽬站点后要完成的⼯作
      site-deploy发布⽣成的站点到服务器上
   maven中提供了许多功能强⼤的插件,让我们更好的管理项⽬。⼀个插件通常提供了⼀组⽬标,可使⽤以下语法来执⾏:
      mvn [plugin-name]:[goal-name]
   例如我们之前使⽤mvn archetype:generate,插件名为archetype,⽽⽬标为generate。我们可以在官⽹的Plugins标签下,查到插件的坐标及插件⽬标的详细描述。
   Maven 提供以下两种类型插件:
类型描述
构建插件在⽣成过程中执⾏,并在 l 中的<build/> 元素进⾏配置
报告插件在⽹站⽣成期间执⾏,在 l 中的 <reporting/> 元素进⾏配置
以下是⼀些常见的插件列表:
插件描述
clean编译后的清理⽬标,删除⽬标⽬录
compiler编译 Java 源⽂件
surefile运⾏JUnit单元测试,创建测试报告
jar从当前项⽬构建 JAR ⽂件
war从当前项⽬构建 WAR ⽂件
javadoc产⽣⽤于该项⽬的 Javadoc
antrun从构建所述的任何阶段运⾏⼀组 Ant 任务
source从当前项⽬构建带源码的JAR⽂件
⽐如我们拿source来测试:
<build>
<!-- 配置插件集 -->
<plugins>
<plugin>
<!--使⽤插件的坐标进⾏引⽤ -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<!-- 绑定在哪个过程时⼀同执⾏,这⾥我们让它在使⽤package打包时⼀同执⾏ -->
<phase>package</phase>
<!--执⾏的⽬标类型,关于⽬标的详细介绍可以在maven官⽹中查到-->
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我们接下来先编译⼀下:
然后,我们在来看使⽤打包命令之后会不会⽣成源jar包。
我们可以看到在下载很多东西了,接下来看下⽂件夹⽣成了源jar包没:
从这⾥我们可看成,这⾥有⼏个关键点,在l当中使⽤plugin来申明要使⽤的插件,然后还可以绑定到某个过程中执⾏,我们这⾥就绑定到了package当中执⾏。
8. l常⽤标签介绍
<!--坐标-->
<groupId>cn.edu</groupId>
<artifactId>maven04</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 默认是jar,其他war zip pom等 -->
<packaging>jar</packaging>
<!-- 配置参数 -->
<properties>
<!-- 这⾥配置项⽬编译编码为UTF-8-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 开发⼈员信息 -->
<developers></developers>
<!-- 项⽬描述 -->
<description></description>
<!-- 许可信息 -->
<licenses></licenses>
<!-- 组织信息 -->
<organization></organization>
<!-- 依赖集,⽤于配置依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- 依赖范围:这个jar包只在范围内⽣效,范围外引⽤会报错,这⾥让junit只在test时被依赖。
其他⼀些情况,如:servlet-api.jar,在编译阶段需要引⽤,⽽在服务器运⾏阶段则不需要引⽤,就可以使⽤scope-->
<scope>test</scope>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。