首页 > 其他 > 详细

Maven学习笔记

时间:2020-04-26 20:57:01      阅读:61      评论:0      收藏:0      [点我收藏+]
?

Maven

?

为什么要学Maven

在日常的项目中,经常会遇到以下几种情况:

  • ①一个项目中包含有多个工程

  • ②项目中需要导入各种不同的jar包,可能会出现工程中导入的jar包出现重复的现象

  • ③导入的jar包需要自己到官网上下载,并且还需要下载相应的依赖jar包

  • ④部署的时候需要添加到路径中去

这些情况会导致的问题:

  • 项目大,不适合使用package进行管理

  • 自己导入的jar包可能来自于不同的网站,使得jar包不规范,进而会拖延项目的时间

  • 对于自己导入的jar包其依赖的jar包也要记,不然会导致项目运行不了

maven可以解决上述问题,以及其他的一些重复性的操作

什么是Maven

以“java源文件”、“jsp”、框架文件”和”HTML“等资源为原材料,生成一个可以运行项目的过程

其中包含了三个过程:

  • ①编译

  • ②部署

  • ③搭建

Maven构建的环节:

  • 清理:清理旧的,已经编译好的文件

  • 编译:将新的java文件编译成新的class文件

  • 测试:自动测试,自动调用Junit

  • 报告:生成测试的报告

  • 打包:动态Web 打成 war包、 java项目打成jar包

  • 部署:将动态Web的可运行文件部署到服务器上(将Web项目生成的war包复制到servlet容器在的指定目录下,使其可以运行

自动化构建:编译、测试、打包、部署

安装Maven

一、检查自己的电脑上的JAVA_HOME是否为Java的bin目录的上一级目录

二、解压Maven的核心压缩包(路径下为全英文和没有空格)

三、自己配置好MAVEN_HOME(或M2_HOME)的环境

tips:
HOME 的环境一般配置在bin目录的上一级目录
path 的环境一般配置在bin目录下

Maven的核心概念

规定的目录结构仓库
POM(Project Object Model) 生命周期/插件/目标
坐标 继承
依赖 聚合

Maven的文件目录结构

重要的:

src: 源码

pom.xml:maven的配置文件,是maven的核心

目的:为了让maven自动的找到这些文件

tips:
如果是自己定义的文件需要配置到maven中:
一、以配置的方式告诉maven:
<param -value>ClassPath</param -value>
二、遵守Maven的内部文件结构规约:
如:log4j.properties
*************
重要: 规约>配置>编码

常用的Maven命令

  • mvn clean:用于清理已经生成的Target文件(旧的编译好了的文件)

  • mvn compile:用于执行主程序的编译(批量)

  • mvn test-compile:用于执行测试程序的编译(批量)

  • mvn test :执行测试

  • mvn package : 执行打包操作

  • mvn install : 将自己的项目导入maven的本地仓库

  • mvn site :生成站点

  • mvn deploy : maven自动部署

关于Maven的联网

在maven的核心中仅仅只定义了抽象的生命周期,具体的实现时依靠各种插件来实现的,而插件并不在其核心之中。在执行插件时,maven先会在本地的仓库中进行查找,然后再到中央仓库中去寻找。

本地的仓库地址为(【用户的User目录】\.m2\repository)

maven 仓库中没有就会连接到中央仓库中进行下载,下载的文件会保存在仓库中的特定的目录下(IJ 中需要点击下载源码才能够保存在本地仓库中)

更改Maven的镜像

打开maven的安装目录:

conf-->settings.xml

找到<mirrors>标签:

<mirrors>
   <mirror>
     <id>alimaven</id>
     <name>aliyun maven</name>
     <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
     <mirrorOf>central</mirrorOf>        
   </mirror>
 </mirrors>

添加之后,下载速度会比外网下载快很多

坐标

maven的坐标有三个变量:

  • groupId: [公司组织的倒述].[项目名称]

  • artifactId:模块名

  • revision:版本号(snapshot 为快照,不稳定)

maven坐标即显示出了项目在仓库中的地址

仓库

本地仓库即用户本地的仓库,可在maven安装目录下的conf下的Settings.xml下配置<localrepository>进行配置。

远程仓库:

局域网仓库

中央仓库

中央仓库的镜像

仓库中包含的内容:

  • maven 的自身插件

  • 第三方框架的jar包

  • 我们自己开发的maven工程

搜索依赖,导入Jar包的网址

IJ的pom.xml中的提示只能显示本地仓库中已经有的文件,导入依赖后,点击下载源文件便可以将导入的Jar包放入本地仓库

依赖

依赖是通过<dependencys>标签引用本地仓库或中央仓库的jar包。

依赖可以引用仓库中的Jar包可以是:

  • ①自己已经编写好了的项目

  • ②在编译的过程中根据Pom.xml中的依赖查找相对应的Jar包

自己编写的项目,并不会自己导入本地仓库需要:

  • (1)通过手动的形式创建相对应的目录后进行导入(非常不提倡)

  • (2)使用mvn install 的命令将自己项目导入maven的本地仓库

依赖的使用范围

依赖的范围 <scop>对主程序对测试程序打包部署
compile 有效 有效 参与 参与
test 无效 有效 不参与 不参与
provided 有效 有效 不参与 不参与

使用依赖范围的例子:

compile 为默认

test 为测试 例如: Junit

provide 例如:servlet-api、jsp-api

技术分享图片

生命周期/插件/目标

  • maven的各个构建环节都是按照顺序执行的

  • maven的核心程序中,定义了抽象的生命周期,其实现为各个插件进行实现

  • maven的核心程序是为了更好的实现自动化构建的这一个特点,按照这一个特点,不论执行生命周期的哪一个阶段,都是从生命周期中最底层开始执行。

  • 插件和目标

    • 目标定义了要执行的目标是什么

    • 各个阶段的插件就是为了完成目标

    • 各个阶段的插件和目标是相对应的

    • 可以将目标看做是插件的方法

在eclipse中配置maven

在设置maven的时候,installation的时候,要选择自己的maven,系统自带的maven的版本低;User settings为指定maven解压目录下的conf文件下的settings.xml文件。

创建maven版的java:

遇到的问题:

解决方案:

创建maven版的javaweb:

遇到的问题:

解决方案:

执行maven命令:

点击pom.xml文件,右键后,选择run as,除了一些基本的选项外,还可以选择build ...在其中输入其他命令来执行,如:compile、deploy和test等命令

配置maven的jdk版本
  • ①可以每次手动进行配置、

  • ②通过配置maven文件的配置(一劳永逸)

    • 打开Settings.xml文件

    • 找到profile标签

    • 加入配置

    <profile>
       <id>jdk-1.8</id><!--Name-->
       <activation>
           <activeByDefault>true</activeByDefault>
           <jdk>1.8</jdk>
       </activation>
       <properties>
           <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>

     

如何构建不同的项目

在选择打包后的不同的文件格式,java选择jar、javaWeb选择war、父工程则选择pom

java web项目中导入servlet-api和jsp-api
<dependencies>
   <dependency>
       <groupId></groupId>
       <artifactId>jsp-api</artifactId>
       <version></version>
       <scop>provided</scop>
   </dependency>
    <dependency>
       <groupId></groupId>
       <artifactId>servlet-api</artifactId>
       <version></version>
       <scop>provided</scop>
   </dependency>
</dependencies>
eclipse导入maven文件是更具Pom.xml文件来进行识别

依赖的传递性

一个模块的依赖可以传给依赖于这个模块的模块

作用: 可以减少各个模块的重复导包,并且使得传递的依赖并不需要在每个模块中重复声明,在“最下面”的工程声明一次依赖即可。(范围为非compile的依赖是不能传递的),若不能传递的则需要在各个模块中重复声明。

排除依赖的传递

什么时候需要排除依赖的传递?

答:当自己引入某个包的时候,其依赖的包不稳定,为了使得整个系统更加稳定则需要排除依赖的传递。

如何进行排除?

<exclusions>
    <groupId></groupId>
       <artifactId></artifactId>
       <version></version>
</exclusions>

排除同样具有传递性,底层的包排除后(排除包A),依赖其的模块由于传递依赖而导入的排除包也会被排除(即包A)

依赖的原则(内置原则)

解决引入的jar包版本不同的问题

1、就近原则

相同的包名,版本不同,则模块引入路径最短的那个

2、先声明原则

相同的包名,版本不同,路径相同,则引入在pom.xml中最先声明的那个

统一的引入的包的版本管理

若需要统一一个框架中各部分的包的版本相同,并且容易更改,怎么办?

答:

  • 手动一个个的更改配置(不推荐)

  • 配置方式

<!--声明一个属性,该属性名字即标签中的name,值为版本号-->
<properties>
   <name>版本号</name>
</properties>
?
<!--在需要引用版本号的地方使用${name}进行使用-->
<version>${name}</version>
tips:
	properties标签并不是只能用来声明版本号,凡是统一声明的地方都可以使用该标签

继承

现状:

在各个模块中Junit的版本可能不一样,导致最后的测试无法统一

目的:

统一管理各个模块工程的Junit依赖版本(由于Junit的范围是test,因此,分散在各个模块中的测试版本很容易不一致

解决思路:

将Junit的依赖版本统一提取到父工程中,在子工程中声明的Junit依赖时,不指定版本。(以父工程中的版本为主,便于修改)

如何做?

答:

  • 创建一个打包方式为Pom的文件

  • 在各个子工程中声明对付工程的引用

    <parent>
       		<groupId>父工程的坐标</groupId>
            <artifactId>父工程的坐标</artifactId>
            <version>父工程的坐标</version>
        
        <!--以当前工程的pom.xml文件为基准的父工程的pom.xml文件的相对路径-->
        <relativePath>Path</relativePath>
    </parent>
  • 将子工程中与父工程相同的内容删除(如本身的<groupId><version>

  • 在父工程中统一Junit的依赖

    <dependencyManagement>
        <dependencies>
         <dependency>
             <!--配置子工程中需要的Junit的坐标-->
            <groupId></groupId>
            <artifactId>Junit</artifactId>
            <version></version>
          </dependency>
        </dependencies>
    </dependencyManagement>

    在配置完成后,应该先install父工程,再安装子工程

聚合

作用:

一键安装各个模块工程

配置方式:

在一个总的聚合模块中配置各个参与聚合的模块

可以在父工程中添加

<modules>
    <module>
         <groupId>子工程坐标</groupId>
        <artifactId>子工程坐标</artifactId>
        <version>子工程坐标</version>
    </module>
	
    <module>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
    </module>
</modules>

执行:在父工程的pom.xml文件上点击右键,运行install命令

自动部署(了解)

命令 : mvn deploy(在cmd窗口下进行使用)

手动部署

javaweb:

  • 将war包放到tomcat的webapps的目录下

  • 运行 catalina run (会根据war包,在该路径下生成相对应的解压文件)

自动部署
<build>
    <finalName>最终项目的名字</finalName>
    <plugins>
        <!--过程中使用的插件-->
        <plugin>
        	<groupId></groupId>
        	<artifactId></artifactId>
        	<version></version>
        </plugin>
    </plugins>
    
    <configuration>
    	<container>
            <continerId>容器名字</continerId>
            <home>对应的HOME</home>
        </container>
        
        <propertise>
           <!--设置属性-->
        </propertise>
        
        <executions>
            <excution>
                <id>名字</id>
                <phase>阶段(install...)</phase>
            </excution>
        </executions>
        
        <goals>
            <goal>目标(run...)</goal>
        </goals>
    </configuration>
</build>

cargo是一家专门从事“启动Servet容器”的组织

实践过程中遇到的问题

  • 导入的jre版本过低

答:可以通过配置settings.xml中的<profile>标签进行

  • 在eclipse导入的环境为jre而非是jdk

答:选择project→properties→add Library → JRE Library → 选择默认的jdk文件

(如果没有配置为Jdk的话,mvn test将无法执行)

  • Test-compile命令 会生成Test的编译文件

    而compile命令 不会生成Test的编译文件

  • 注意: 有依赖于自己写的项目时,记得将依赖项目导入maven的本地仓库(使用mvn install命令),如果需要移除自己的项目,只需要找到maven仓库中的文件,删除即可

  • 在eclipse中无法通过编译查看运行结果,只能够使用mvn test来进行测试,所以与IntellJ相比,IJ 更好用

  • 如果引用同一项目的不同版本,那么将会在同一项目的目录下,存储不同版本的文件

  • <exclusions>是在<dependencise>标签中使用,<exclusion>中的坐标不需要版本号(排除依赖时,使用)

  • 注意:父工程的打包方式必须为"pom"形式,记得在子工程中的<parent>标签中加入坐标后,还应该加入<relativePath>(以当前目录为基准,父工程的pom.xml文件的相对路径)标签

  •  

Maven学习笔记

原文:https://www.cnblogs.com/wan123/p/12782108.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!