Maven

概述

jar包下载到lib目录下:有用没有,冲突,是否因关联而不可删除。
maven,ant,gradle都是用来解决jar包下载的问题。
maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。更好的管理项目,是一套强大的自动化工具。覆盖了编译、测试、运行、清理、打包和部署。贯穿了整个项目周期,提供了一个仓库的概念,统一管理项目依赖的第三方jar包,最大程度降低因环境问题导致的兼容性问题。
下载maven包后解压。bin目录中包含mvn的运行脚本。boot包含一个类加载器的框架。conf是配置文件目录。lib下是maven平时所用的类库,除了maven自身的,还包含第三方依赖的类库。
环境变量的配置:

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91:没有\bin
MAVEN_HOME=E:\apache-maven-3.3.9
Path=%MAVEN_HOME%\bin
Path=%JAVA_HOME%\bin

maven的目录结构

src
    -main
        -java
            -package
    -test
        -java
            -package
    resources

pom.xml文件的写法:

对于一个struts项目,找到struts源码文件的lib目录下的core的jar包,将其打开,找到maven中的pom文件,拷贝出来,保存到其他位置并打开。
删去无关项:仅保留第一行、project、modelversion(代表maven版本(4.0.0是固定的))。新增:groupId:项目的包名、artifactId的值是模块名、version版本名、dependencies依赖(里面每个依赖都要有上面三项)
都写好后,放到src一级的目录下

编译:mvn compile
测试:mvn test
给项目生成jar包:mvn package
查看maven版本:mvn -v
删除target:mvn clean//target中存放的是编译好的字节码文件和测试报告(report)
安装jar包到本地仓库中:mvn install

某个类不存在,即找不到某个类:通常是吧包含这个类的jar包添加到classPath路径中。maven提供了另外一种方法:

  1. 进入到被引用的(即被找不到的)那个类中的目录中mvn install//包含缺失类的jar文件发布到本地仓库中
  2. 配置pom,新增依赖<dependency>缺失类的jar包的坐标(groupId、artifactId、version)</dependency>
  3. mvn compile看是否会BUILD SUCCESS

在运行mvn compile进行编译的过程中,程序用到了其他的知识包,会到pom.xml上查找是否引入了该依赖包的坐标。若引入,则到本地仓库中查找,若有,maven会将该jar包加入到项目的classPath中,否则会从网上maven的中央仓库中去查找下载到本地仓库中供项目使用。

maven自动建立目录骨架

开发项目第一步:创建相应的目录来存放我们的项目资源和代码。
archetype插件:用于创建符合maven规定的目录骨架。
方法一:mvn archetype:generate:按照提示进行选择

  1. 然后选择archetype版本号:以6为例。
  2. 依次输入groupId,artifactId,version,package。

方法二:mvn archetype -DgroupId=com.snjsdcn.maven04(组织名、公司网址的反写.项目名) -DartifactId=maven04-demo(项目名-模块名) -Dversion=1.0.0SNAPSHOT(版本号) -Dpackage=com.scidsnas.maven04.demo(代码所存在的包名:groupId+artifactId):一次进行所有设置

maven中的坐标和仓库

任何一个依赖、插件、项目构建的输出都可以被称之为构件,构件通过坐标作为其唯一的标识。groupId,artifactId,version:就是项目的坐标,构成项目唯一的标识。包名应该与groupId,artifactId相吻合。

仓库:就是用来管理项目的依赖的。本地仓库中没有,则会到远程仓库(全球仓库)中查找。远程仓库中一般都会有我们所需的各种jar包的版本。

全球仓库的地址:lib目录下:maven-model-builder解压后的pom-4.0.0.xml(这是个超级pom,所有的pom都会继承自这个pom),<respository>里的地址就是默认的全球中央仓库的地址。

镜像仓库:提供了和国外的一样的功能。修改要镜像仓库所需的配置:

maven的安装目录下的conf文件夹下的settings.xml找到mirror。

<mirror>
      <id>maven.net.cn</id><!--表示该镜像仓库的Id-->
      <mirrorOf>central</mirrorOf><!--为哪个id的仓库配置镜像-->
      <name>central mirror in china</name><!--指定仓库名-->
      <url>http://maven.net.cn/content/groups/public</url><!--指定URl,所有对原中央仓库的访问都会变成对新的URl的访问-->
    </mirror>

如何更改仓库的位置:maven从远程仓库中下载构件,默认是存放在当前用户目录中.m2的respository里面。一般不想放在C盘中。更改方法:
maven的安装目录下的conf文件夹下的settings.xml找到localRespository。直接更改路径。
将settings.xml文件直接复制到更改后的目标路径文件夹中,这样更新maven版本时,就不必再修改settings.xml。

在eclipse中安装maven插件以及创建maven项目

将maven插件安装到eclipse安装目录的dropins文件夹下,重启eclipse。
maven的运行需要JDK,而eclipse是运行在JRE上的。
解决办法:

  1. 根据提示修改eclipse.ini文件。进入eclipse根目录,打开eclipse.ini文件。在里面添加-vmJDK的安装路径\javaw.exe保存。
  2. 修改eclipse默认的JRE,让其可以找到JDK。(有的时候tools.jar报错就是因为eclipse运行的JRE中没有tools.jar,而JDK中有):eclipse操作:点击Java→install JRE→打开JDK的目录→确定勾选
  3. 更改maven配置成本机的maven:maven→Installation→maven的安装路径
  4. 修改settings.xml的路径:maven→User Settings→settings的路径
用dropins安装zip插件遵循的原则
        1.查看下载的zip包,如果是类似于update-site的zip包,其实这是离线更新包,正确的安装用法应该是用Eclipse Local update site installation.->这种包不应该放到dropins,即便有几率会成功,但是是非常规手段。
        2.虽然有些zip包名字是类似update-site的包,但是其解压缩后只有features和plugins两个子目录而没有额外的东西,这样的包其实很多直接解压放到dropins目录下进行加载的。
        3.查看zip包内容,如果包含content.jar/artifacts.jar/site.xml等文件的,一定要用Local update site installtion.因为这种是插件更新包,是专门用来本地更新安装的,会装额外的依赖等.

运行maven:pom.xml→右键→Run as→maven build→在Goals里面写命令(例如compile、package)→run

maven的声明周期和插件

完整的项目的构建过程包括:清理、编译、测试、打包、集成测试、验证、部署
maven生命周期是相互独立的:

  1. clean:清理项目
  2. default:构建项目
  3. site:生成项目站点

每个生命周期包含了很多阶段,这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。阶段会顺序执行,但不会触发其他生命周期中的任何一个阶段。

运行package命令时,如果compile、test还未执行,此时会先执行这两个命令。

clean:

  1. pre-clean:执行清理前的工作
  2. clean:清理上一次构建生成的所有文件
  3. post-clean:执行清理后的文件

default(最核心的)包含了构建项目中所需要的步骤: compile test package install

site会根据pom中的信息自动生成项目站点:

  1. pre-site在生成项目站点前要完成的工作
  2. site生成项目的站点文档
  3. post-site在生成项目站点后要完成的工作
  4. site-deploy发布生成的站点到服务器上

maven中的pom解析

pom.xml是maven项目的核心管理文件,用于项目描述、组织管理、依赖管理和构建信息的管理。
常用元素

  1. project:根元素,包含一些约束信息
  2. modelVersion:指定了当前pom的版本
  3. 坐标信息:groupId(主项目标识,用来定义maven是属于哪个实际的项目的:反写的公司网址+项目名)、artifactId(模块的标识:实际项目中的模块:项目名+模块名)、version(三个数字组成:第一个0表示大版本号,第二个表示分支版本号,第三个表示小版本号;snapshot是快照,alpha是内测版本,beta是公测版本,release版本是一个稳定的版本,GA版本是一个正式的发布版本)、package(maven项目的打包方式,不指定即默认时是jar,还可以打包成war,zip,pom)(maven的项目和实际的项目不是一一对应的关系,maven的项目体现的是一种模块化的概念,一个实际项目会被划分成很多模块)
  4. 还可以有name标签:项目描述名;URL:项目地址;description:项目描述;developers:开发人员列表;licenses:开源框架的许可证信息;organization:组织信息
  5. 依赖列表:dependencies,可以包含多个依赖项(dependency),通过指定坐标(groupId,artifactId,version,type,scope(依赖的范围:JUnit的依赖范围是test,即只在测试的范围内有用,在主代码中使用就会报错),optional(设置依赖是否可选,默认是false即继承,若为true则必须显式的引入该依赖),exclusions(排除依赖传递列表:A依赖B,B依赖C,想要排除A对C的依赖:只想要用spring的jar,而其他相关的不想引用),dependencyManagement(依赖管理:在这里面声明依赖列表,但并不会真正被运行:用于定义在父模块中,供子模块继承用:抽象出一个父类模块对JUnit进行定义,其他子模块直接继承),build(对构建行为提供相应的支持:内部定义plugins(插件列表)里面可以包含多个plugin,在plugin里面也要指明坐标),parent(用于在子模块中对父模块pom的继承),modules(用来聚合运行多个maven项目))

maven依赖范围

依赖范围是用来控制依赖与三种classPath(编译、测试、运行)之间的关系:

  1. compile:默认的范围,编译测试运行都有效
  2. provided:在编译和测试的时候有效(Servlet API 在本地时需要,但在容器中已经有了该API,就不需要了,否则会导致冲突:即运行时的环境已经provided)
  3. runtime:在测试和运行时有效(JDBC驱动)
  4. tese:只在测试是有效(JUnit)
  5. system:只在编译和测试时有效,与本机系统相关联,可移植性差
  6. import:导入的范围,它只是用在dependencyManagement中表示从其他的pom中导入dependency的配置

依赖传递

被依赖的一定要在要依赖的compile前打包(clean package→install)(compile不包括打包)
排除依赖:exclusions:

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <exclusions>
            <exclusion>
                <groupId></groupId>
                <artifactId></artifactId>
                <version></version>
            </exclusion>
        </exclusions>
    <dependency>
</dependencies>

maven的JRE System Library默认是使用J2SE-1.5(右键→properties),实际是1.7,可以直接修改(这样每次都需要修改)。

经常使用:settings.xml找到profiles,把里面的1.4都改成1.7或者1.8

依赖冲突

A和B依赖了一个不同版本的相同的构件C,冲突:究竟依赖了哪一个版本的构件?

原则:

  1. 短路优先:优先解析路径短的版本。A→B→C→X(jar);A→D→X(jar)。此时会优先解析路径短的版本。
  2. 先声明先优先:如果路径相同,则谁先声明,先解析谁。

maven聚合和继承

想将多个项目进行install,将其安装到本地仓库中。maven中提供了一齐运行的方式:聚合。

聚合:

  1. 新建maven项目:packaging→pom
  2. 新建modules标签,内含多个module(原来install打包的单元)
  3. run as→clean package

继承:都使用了同一个依赖,若每个都配置则造成重复代码。可以当成一个父类:

  1. 新建一个父类,修改其pom。将子类中共同的依赖<dependency></dependency>放到<dependencyManagement></dependencyManagement>中。在properties属性中可以增加版本信息,此时依赖中的版本信息就可以写作:<version>$(junit.version)</version>(EL表达式)
  2. 将packaging改为pom
  3. 此时test文件夹上仍然有×号,对于父类来说,test,main没有用途,可以直接删除→maven→Update Project→OK

对于子类来说:

  1. 删除已经放在公共部分(JUnit)的版本号、scope
  2. 新增parent标签,引入父类pom的坐标

构建web项目

archetype:web-app
增加servlet的API(scope为provided)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值