zoukankan      html  css  js  c++  java
  • 第十九章、Maven基础

    一、Maven初识

    • 目前无论是IDEA还是Eclipse等其他IDE,使用里面的ANT工具。ANT工具帮助我们进行编译,打包运行等过程。
    • Apache基于ANT进行了升级,研发出了全新的自动化构建工具Maven
    • Maven是Apache的一款开源的项目管理工具
    • 无论是普通的JavaSE还是JavaEE项目,我们创建的是Maven项目
    • Maven使用项目对象模型(POM-Project Object Model,项目随对象模型)的概念,可以通过一小段描述信息管理项目的构建,报告和文档的软件项目管理工具。在Maven中每个项目都相当于一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果

    二、Maven安装-IDEA

    1. IDEA整合Maven

    image-20210106095055385

    2. 下载地址

    3. 目录结构

    • image-20210106095428728

    • bin:存放的是执行文件

    • conf:下面有一个非常重要的配置文件 ---> settings.xml --->maven的核心配置文件/全局配置文件

    4. Maven配置环境变量

    image-20210106095834109

    image-20210106100003978

    image-20210106100127757

    三、Maven仓库

    1. 初步介绍

    • Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构建)的一个服务。
    • 仓库中的任何一个构建都是其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。得益于Maven的坐标机制,任何Maven项目使用任何一个构建方式都是完全相同的。
    • Maven可以在某一个位置存储所有的Maven项目共享的构建,这个唯一的位置就是仓库,项目构建完毕后生成的构建也可以安装或者部署到仓库中,供其他项目使用
    • 对于Maven来说,仓库分为两类:本地仓库、远程仓库

    2. 远程仓库

    • 不在本机中的一切仓库,都是远程仓库:中央仓库、本地私服

    2.1 中央仓库

    • 远程仓库指的是通过各种协议如:file://和http://访问的其他类型的仓库。

    • 这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构建下载

    • 地址:https://mvnrepository.com/

      image-20210106102757877

      image-20210106102842120

      image-20210106102909204

    2.2 本地私服

    • 自己公司内部在局域网上搭建的仓库就是本地私服,用来在开发团队间共享私有构建和管理发布的

    3. 本地仓库

    • 本地仓库指的是本机的一份拷贝,用来缓存远程下载,包含你尚未发布的临时构建

      image-20210106103112877

      image-20210106103145615

    4. 仓库配置

    4.1 配置本地仓库

    image-20210106143501748

    image-20210106143628784

    4.2 配置镜像仓库

    如果仓库A可以提供仓库B存储的所有内容,那么你就可以认为A是B的一个镜像。

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

    image-20210106143501748

    image-20210106143755985

    5. 仓库优先级问题

    image-20210106155421680

    四、JDK的配置

    • 当你的IDEA中有多个jdk时,就需要你指定编译和运行的jdk

    • 在settings.xml中配置

      <profile>
          <!--settings.xml中的id不能随便起-->
          <!--告诉maven我们用的是jdk1.8-->
          <id>jdk-1.8</id>  
          <!--开启编译器的使用-->
          <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> 
      

    image-20210106155947494

    • 配置的前提是你的IDEA中要有jdk1.8

    总结

    ​ 在settings.xml中:配置了三个信息

    1. 本地仓库
    2. 镜像仓库
    3. JDK

    五、Maven工程类型

    5.1 POM工程

    POM工程就是逻辑工程。用在父级工程或聚合工程。用来做jar包的版本控制的

    5.2 JAR工程

    将会打包成jar,用作于jar使用。即常见的本地工程 ----》Java Project

    5.3 WAR工程

    将会打包成war包,发布在服务器上的过程

    六、在IDEA中创建Maven工程

    6.1 过程

    image-20210106160833358

    image-20210106161349953

    标准目录结构

    image-20210106161518092

    6.2 目录结构介绍

    • src/main/java

      这个目录下存储java源代码

    • src/main/resources

      存储主要的资源文件。比如xml配置文件和properties文件

    • src/test/java

      存储测试用的类,比如Junit的测试一般就放在这个目录下面

      因为测试类本身就是不属于项目的,所以放在任何一个包下都显得很尴尬,所以Maven专门创建一个测试包,用于存放测试的类

    • src/test/sources

      可以创建你自己的资源文件,存储测试环境用的资源文件

    • src

      包含了项目所有的源代码和测试你文件,以及其他项目相关的文件

    • target:需要执行mvn install命令才会出现

      编译后内容放置的文件夹

    • pom.xml

      是Maven的基础配置文件。配置项目和项目之间关系,包括配置依赖环境等等

    • 结构图

      -- MavenDemo项目名
      	-- .idea项目的配置,自动生成,无需关注
          -- src
          	-- main 实际开发内容
              	-- java写包和java代码,此文件默认只编译.java文件
                  -- resources所有的配置文件,最终把配置文件放入到classpath中。
              -- test 测试时使用,自己写测试类或者Junit工具等
              	-- java 存储测试用的类
          -- pom.xml 整个Maven项目所有的配置文件
      
    • 注意:目录名字不可以随便修改,因为Maven进行编译或者jar包生成操作的时候,是根据这个目录结构来找的,你若轻易动,那么就找不到了

    七、POM模式--Maven工程关系

    Maven工具局域POM(Project Object Model,项目对象模型)模式实现的。在Maven中每一个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分等效果。

    7.1 依赖关系

    <1> 特性

    ①、依赖关系

    ​ 即A工程开发或运行过程中需要B工程提供支持,则代表A工程依赖B工程

    ​ 在这个种情况下,需要在项目A项目的pom.xml文件中增加下属配置定义依赖关系。

    image-20210106164042701

    ​ 通俗理解:就是导jar包。

    ​ B工程可以是自己的项目打包后的jar包,也可以是中央仓库的jar包

    ②、如何注入依赖?

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

    <groupId>com.xxx</groupId>
    <artifactId>maven01</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    ③、依赖的好处
    • 省去程序员手动添加jar包的操作,省事

    • 可以帮我们解决jar包冲突

      image-20210106165021159

    ④、传递性依赖
    传递性依赖是Maven2,0的新特新,假设你的项目依赖于一个库,而这个库又依赖于其他的库。你不必自己去找出所有这些依赖,只需要加上直接依赖的库,Maven会隐藏式的把这些依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或则从父项目继承,或则通过传递性依赖
    

    如果A依赖了B,那么C依赖A时会自动把A和B都导入进来

    image-20210106170212194

    创建A项目后,选择IDEA最右侧Maven面板lifecycle,双击install后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目

    <2> 原则

    ①、第一原则:最短路径优先原则

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

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

    ②、第二原则:最先声明原则

    依赖路径长度是一样的时候,第一原则不能解决所有问题,比如这样的依赖关系:A->B->Y(1.0),A->C->Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,那么到底谁会被解析使用呢?在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜

    <3> 依赖范围

    依赖范围就决定你依赖的坐标,在什么情况下有效,什么情况下无效

    compile

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

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    
    provided

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

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    runtime

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

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    
    system

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

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>system</scope>
        </dependency>
    </dependencies>
    
    test

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

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    import

    import范围只适用于pom文件中的部分。表明指定的POM必须部分的依赖

    注意:import只能用于dependencyManagement的scope里。

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
            <scope>import</scope>
        </dependency>
    </dependencies>
    

    7.2 继承关系

    如果A工程继承B工程,则代表A工程默认依赖B工程的所有资源,且可以应用B工程中定义的所有资源信息。

    被继承的工程(B工程)只能是POM工程

    注意:在父项目中放在中的内容时不被子项目继承,不可以直接使用

    放在中内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)

    7.3 聚合关系

    当我们开发的过程拥有两个以上的模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程
    
    在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目,war项目是没有办法做聚合工程的),各子模块可以使任意类型模块(Maven Model)
    
    前提:继承
    
    聚合包含了继承的特性
    
    聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这是父项目类型为pom类型。同时在父项目的pom.xml中出现<modules>表示包含的所有子模块
    

    八、常见插件

    8.1 编译器插件

    通过编译器插件,我们可以配置使用的JDK或者说编译器的版本

    ① settings.xml文件中配置全局编译器插件

    • 找到profiles节点,在里面加入profile节点

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

    ②、配置编译器差价近:pom.xml配置片段

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

    8.2 资源拷贝插件

    Maven在打包时默认只将src/main/resources里面的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。

    我们的配置文件,一般都放在:src/main/resources

    然后打包后配置文件就会在target的classes下面放着

    pom.xml配置片段

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

    8.3 tomcat插件

    我们如果创建war项目,必然要部署在服务器上,方式

    1. 部署在远程服务器上
    2. 将IDEA和外部Tomcat产生关联,然后将项目部署在外部Tomcat上

    现在学习一个新的方式,不在依赖外部的Tomcat,maven提供了Tomcat插件,我们可以配置来使用

    使用哪个Tomact插件发布部署并执行war工程的时候,需要使用启动命令,启动命令为:tomcat7:run。命令中的tomcat是插件名,由插件提供商决定。run为插件中具体功能。

    (注意:之前用的编译器插件,资源拷贝插件,不是可运行的插件,maven直接帮我们运行好了,但是tomcat属于可运行插件,他使用的时候需要程序员来控制,怎么控制?必须通过命令来运行控制

    具体pom.xml文件的配置如下

    <build>  
        <plugins>
            <!--配置tomcat插件-->
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-compiler-plugin</artifactId>  
                <version>2.2</version>  
                <configuration>  
                    <source>1.7</source>  
                    <target>1.7</target>  
                </configuration>  
            </plugin>  
            <plugin>
           <groupId>org.apache.tomcat.maven</groupId>
           <artifactId>tomcat7-maven-plugin</artifactId>
           <configuration>
              <!-- 配置Tomact监听端口可改 -->
              <port>8080</port>
              <!-- 配置项目的访问路径(Application Context) -->
              <path>/</path>
           </configuration>
             </plugin>
        </plugins>  
     </build>
    

    九、Maven常见命令介绍

    Maven的命令非常多,我们这只讲解几个:(所有命令都可以在控制台运行的)

    ①、install

    本地安装,包含编译,打包,安装到本地仓库

    编译 -javac

    打包 -jar,将Java代码打包为jar文件

    安装到本地仓库 -将打包的jar文件,保存到本地仓库目录中

    ②、clear

    清除已编译的信息

    删除工程中的target目录

    ③、compile

    只编译。java命令

    ④、package

    打包。包含编译,打包两个功能

    ⑤、install和package的区别

    • package命令完成了项目编译、单元测试、打包功能,但没有把打好包的可执行jar包(war包或其他形式的包)部署到maven仓库和远程maven私服仓库中

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

  • 相关阅读:
    C# 为WebBrowser设置代理,打开网页
    C# WebBrowser 设置代理完全解决方案
    java读取文件的几种方式性能比较
    .NET 对文件和文件夹操作的介绍
    java利用反射打印出类的结构
    java输出月的日历控制台
    java 实现二分查找算法
    java实现快速排序
    解决window 12 service 不能调用excel ,报"System.Runtime.InteropServices.COMException (0x800A03EC)
    3 webpack 4 加vue 2.0生产环境搭建
  • 原文地址:https://www.cnblogs.com/borntodie/p/14243250.html
Copyright © 2011-2022 走看看