Maven总结

什么是Maven

Maven使用项目对象模型(POM-Project Object Model,项目对象模型)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。

Maven的下载

http://maven.apache.org/

Maven仓库

远程仓库

不在本机中的一切仓库,都是远程仓库:分为中央仓库 和 本地私服仓库
远程仓库指通过各种协议如file://和http://访问的其它类型的仓库。这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如repo.maven.apache.org和uk.maven.org是Maven的中央仓库)。其它“远程”仓库可能是你的公司拥有的建立在文件或HTTP服务器上的内部仓库(不是Apache的那个中央仓库,而是你们公司的私服,你们自己在局域网搭建的maven仓库),用来在开发团队间共享私有构件和管理发布的。
默认的远程仓库使用的Apache提供的中央仓库:
https://mvnrepository.com/

本地仓库

本地仓库指本机的一份拷贝,用来缓存远程下载,包含你尚未发布的临时构件。
一般存放在 {path}/m2/

优先级问题

在这里插入图片描述
都是从本地仓库开始, 本地仓库不存在, 则去看配置文件是否配置了镜像仓库, 配置了, 则去镜像仓库, 如果镜像仓库还没有, 最终都会去中央仓库.

配置镜像仓库

<mirrors></mirrors>中间加入以下内容.
我们使用的是阿里云仓库作为镜像仓库

<mirror> 
                <!-- 指定镜像ID(可自己改名) -->
                <id>nexus-aliyun</id> 
                <!-- 匹配中央仓库(阿里云的仓库名称,不可以自己起名,必须这么写)-->
                <mirrorOf>central</mirrorOf>
                <!-- 指定镜像名称(可自己改名)  -->   
                <name>Nexus aliyun</name> 
                <!-- 指定镜像路径(镜像地址) -->
                <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
        </mirror>

配置本地仓库

windows一般都是我们在C:\Users\{name}下. 修改<localRepository>可以更改本地仓库位置

<localRepository>{path}/m2</localRepository>

Maven项目结构

--MavenDemo 项目名
  --.idea 项目的配置,自动生成的,无需关注。
  --src
    -- main 实际开发内容
         --java 写包和java代码,此文件默认只编译.java文件
         --resource 所有配置文件。最终编译把配置文件放入到classpath中。
    -- test  测试时使用,自己写测试类或junit工具等
        --java 储存测试用的类
  pom.xml 整个maven项目所有配置内容。

Maven三种关系

依赖

在pom.xml文件 根元素project下的 dependencies标签中,配置依赖信息,内可以包含多个 dependence元素,以声明多个依赖。每个依赖dependence标签都应该包含以下元素:groupId, artifactId,version : 依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的, Maven根据坐标才能找到需要的依赖。
A

<groupId>cn.llCnll</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
	<lombok.version>1.16.10</lombok.version>
</properties>
<dependencies>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>${lombok.version}</version>
	</dependency>
</dependencies>

两个原则

  • 第一原则:最短路径优先原则

    最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

    例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。

  • 第二原则:最先声明原则

    依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

排除依赖

exclusions: 用来排除传递性依赖 其中可配置多个exclusion标签,每个exclusion标签里面对应的有groupId, artifactId, version三项基本元素。注意:不用写版本号。

依赖范围

<scope></scope>

compile

这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时都生效。

provided

已提供依赖范围。使用此依赖范围的Maven依赖。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)

runtime

runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

system

系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。

test

test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junit的jar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope-test

import

import范围只适用于pom文件中的<dependencyManagement>部分。表明指定的POM必须使用<dependencyManagement>部分的依赖。
注意:import只能用在dependencyManagementscope里。

继承

如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。
被继承的工程(B工程)只能是POM工程。
注意:在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用放在<dependencyManagement>中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写 <group id><artifact id>即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。

父工程

<groupId>cn.llCnll</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
	<lombok.version>1.16.10</lombok.version>
</properties>
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>${lombok.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>

子工程

<groupId>cn.llCnll</groupId>
<artifactId>Child</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
	<groupId>cn.llCnll</groupId>
	<artifactId>Parent</artifactId>
	<version>1.0-SNAPSHOT</version>
</parent>

<dependencies>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId></version>
	</dependency>
</dependencies>

本质上:POM文件的继承

聚合

当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。
在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。
前提:继承
聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现表示包含的所有子模块。

在这里插入图片描述
写法同继承

Maven常见命令

  • install 本地安装, 包含编译,打包,安装到本地仓库
  • clean 删除工程中的target目录
  • compile 只编译
  • package 打包。 包含编译,打包两个功能。

install和package的区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

常见插件

编译器插件

全局配置

settings.xml文件中配置
在settings.xml <profiles></profiles>中配置:

<profile>
                <!-- 定义的编译器插件ID,全局唯一,名字随便起 -->
                <id>jdk-1.8</id>
                <!-- 插件标记,activeByDefault :true默认编译器,jdk提供编译器版本 -->
                <activation>
                                <activeByDefault>true</activeByDefault>
                                <jdk>1.8</jdk>
                </activation>
                <properties>
                        <!-- 配置信息source-源信息,target-字节码信息,compilerVersion-编译过程版本 -->
                        <maven.compiler.source>1.8</maven.compiler.source>
                        <maven.compiler.target>1.8</maven.compiler.target>
                        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
                </properties>
    </profile>

局部配置

pom.xml文件中配置

<!-- 配置maven的编译插件 --> 
<build>
    <plugins>
    <!--JDK编译插件 -->
          <plugin>
        <!--插件坐标 -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
         <!-- -->
        <configuration>
          <!-- 源代码使用JDK版本-->
          <source>1.8</source>
           <!-- 源代码编译为class文件的版本,要保持跟上面版本一致-->
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

资源拷贝

Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。
配置文件一般都放在:src/main/resources , 然后打包后配置文件就会在target的classes下面放着.

把非resources下面的文件也打包到classes下面,
pom.xml文件中配置

<build>
 		<resources>
                 <resource>
                         <directory>src/main/java</directory>
                         <includes>
                                 <include>**/*.xml</include>
                         </includes>
                 </resource>
                 <resource>
                         <directory>src/main/resources</directory>
                         <includes>
                                 <include>**/*.xml</include>
                                 <include>**/*.properties</include>
                         </includes>
                 </resource>
         </resources>
 </build>

配置好以后都会都会打包到classes下面

Tomcat插件

使用Tomcat插件发布部署并执行war工程的时候,需要使用启动命令,启动命令为: tomcat7:run。命令中的tomcat7是插件命名,由插件提供商决定。run为插件中的具体功能。
pom.xml文件中配置

<build>
    <plugins>
      <!-- 配置Tomcat插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
     <!-- 配置Tomcat监听端口 -->
          <port>8080</port>
     <!-- 配置项目的访问路径(Application Context) -->
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值