2020:0521 -- Maven

209 阅读11分钟

一、Maven认识

    依赖管理:Maven工程对jar包的管理过程。
    相当于把jar包抽取出来,每个项目都通过坐标字jar包仓库找到相应的jar包。
不必每个项目都放一份jar包了
    代码可重用,减少耦合性。

Maven的一键构建和本地安装tomcat的一键构建:    
    构建项目:我们之前使用本地安装的tomcat对项目进行编译,测试,运行,打包,安装,部署
的任何一步操作都是在构建项目。只不过是这些操作对项目构建的程度不一样而已。
    Maven的一键构建:我们不在使用本地安装的tomcat,而是使用maven自身集成的tomcat插件来
完成这些操作的过程,则就是maven的一键构建。
    不同:
        1.本地tomcat:我们必须把整个项目打包放到webapps目录下,然后bin目录下找到startup
    ,才能把项目运行起来。
        2.Maven运行一个项目:
        

Maven解压后的目录结构:
    bin/mvn  : 用来构建项目
    boot/plexus-classworlds-2.5.2.jar  :   maven自身运行所需要的类加载器
    conf/settins.xml    :   我们对maven进行配置时主要使用的配置文件。
    lib/...   :   许多maven自身运行所依赖的jar包。里面一定集成的有tomcat插件,因为maven
                   是可以有自己的tomcat插件来构建项目的

环境变量配置:
    MAVEN_HOME :D:\Developer_Tools\apache-maven-3.5.2
    Path    :   %MAVEN_HOME%\bin
    注意:MAVEN运行时,需要依赖JAVA_HOME,我们必须确保我们的环境变量中有JAVA_HOME。
    
修改本地jar包仓库的位置:    
jar包仓库:本地仓库,Default: ${user.home}/.m2/repository
        当我们启动一个maven工程的时候,默认回去系统盘找本地jar包仓库---本地仓库。
    maven刚安装完时,本地仓库里是没有jar包的。但是如果我们的电脑是联网的,可以自己找
    到一个叫做中央仓库的地方,直接自己下载坐标对应的jar包。
        即我们启动一个maven工程,首先是通过坐标到本地仓库找jar包。
        
远程仓库:私服 
        一般我们不需要中央仓库里所有的jar包,为了在不联网的情况下可以开发,也为了我们
    公司自己内部项目所需要的jar包可以直接放到一个统一的地方,我们会在创建一个仓库----
    远程仓库。别名---私服
        在公司中我们只需确保,自己的电脑和远程仓库在同一个局域网,就可以直接通过局域网
    从远程仓库下载jar包。如果还是没有,可以本地上传,也可以去中央仓库下载。

修改:settins.xml 
      <localRepository>D:\Developer_Tools\maven_repository</localRepository>
      其中:D:\Developer_Tools\maven_repository 就是我们新的本地仓库。
      
1.Maven标准目录结构:
    我们最终开发完的项目,代码应该分几部分?
        * 核心代码部分:肯定要打成jar包,发布到线上变成产品,供用户使用。那么用户的使用
          就预示着我们要根据用户的体验度要不断的对项目进行维护和升级,每一次的升级都会
          导致把代码重新打jar包,有些要频繁修改的部分,我们难道也要频繁的打jar包吗?
          --------需要配置文件部分来改善。
        * 配置文件部分:配置文件我们并不打到java代码中,最终打成jar包的时java代码,而
          配置文件时jar包之外的东西。所以我们即便频繁修改配置文件也不用重新打jar包,只
          需要重新启动一下项目即可。
        * 为了确保核心代码正确率足够高,我们就要做大量的单元测试,这些单元测试组成了第
          三部分-----测试代码:
        * 测试代码肯定它需要用到它自己测试的配置文件----测试配置文件
    所以最终的项目:4部分。
    
    1.1传统项目:
       项目名
            src
        那么将开发完的项目的4部分都放到src,就很容易发生打包混乱。你可以通过在建立一些
        文件夹来分别放着4部分,比如config,resources...这样虽然在打包时分门别类清晰许多。
        但是这是你自己建立的文件夹,没有统一的标准,别人不一定看得懂。
        
    1.2统一的标准:maven项目标准目录结构
        Maven的java工程:
            src/main/java目录 :    核心代码部分
            src/main/resources:    配置文件部分
            src/test/java目录  :    测试代码部分
            src/test/resources:     测试配置文件
        Maven的web工程:
            src/main/java目录 :    核心代码部分
            src/main/resources:    配置文件部分
            src/test/java目录  :    测试代码部分
            src/test/resources:     测试配置文件
            src/main/webapp   :     页面资源,js,css,图片等等。

2.Maven常见的命令
    mvn clean:把编译好的项目中的信息直接删掉。当我们进入公司之后,如果领导让我们接着
               另外一个的项目进行开发,那么我们拿到他的项目之后,里面会包含很多本地编
               译好的信息。那么我们要想将他的项目导入到本地环境,我们必须先执行mvn clean
               命令删除他本地编译的所有信息。因为开发中我们每个人的开发环境不一定都是
               相同的,他编译的代码,在我们的电脑上不一定运行的通。
               
    mav compile(编译): 将src/main/java目录下的代码进行编译。放置在了target目录下。
    
    mvn test:将src/test/java目录和src/main/java目录下的代码都编译,放在了target目录下。
    
    mvn package:会将src/test/java目录和src/main/java目录下的代码都编译,同时将项目打成
                 war包/jar包,根据pom.xml中的配置来决定时war还是jar。
                 
    mvn install: 会将src/test/java目录和src/main/java目录下的代码编译,而且打包,还把这个包(项目)安装到了本地仓库
    
    * 小结:执行后面的命令会将前面的命令在执行一次。(除了 mvn clean)

3.Maven的生命周期
    maven有一个核心功能:一键构建。就是我们使用maven自身集成的tomcat插件对项目进行构建。
    构建的步骤:编译,      测试,  打包,      安装,      发布
                compile,    test,   package,    install,    deploy
                如果项目是在我们自己电脑上从头到尾开发完的,我们直接编译即可。但是有些
        项目在别的电脑上进行了一些编译,测试,打包,安装,发布等操作的话。我们接手该项
        目后,必须清除掉之前在别人电脑上的一些编译信息-------执行mvn clean。
                上面我们知道:执行后面的命令会将前面的命令在执行一次。那么这5条命令:
        compile,    test,   package,    install,    deploy之间好像有一定的关系。
        
    3.2 什么关系呢?
        这5套命令其实是一套生命周期。这5个命令所在的生命周期叫做默认生命周期。
        compile,    test,   package,    install,    deploy
        
        * 清理生命周期:而clean是一套独立的生命周期,清理生命周期。
        * 站点生命周期:用的不多,不做解释。
        
4. Maven概念模型图
    1.项目对象模型(POM):指的就是maven工程中的pom.xml文件。打开一个pom.xml看一下:
    ```
    <!-- 这些是项目 自身的信息i -->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>cn.itcast.maven</groupId>
	<artifactId>maven-helloworld</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>第一个maven工程</name>
	<description>第一个maven工程</description>
	
	<!-- 项目运行所依赖的jar包 -->
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
			<scope>test</scope>
		</dependency>


		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	
    <!-- 配置了很多插件 -->
    <build>
	<plugins>
	        <!-- 插件1:JDK插件 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
		<!-- 插件2:tomcat插件 -->
	        <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <version>2.1</version>
                        <configuration>
                            <port>9090</port>
                            <path>/mgr</path>
                            <uriEncoding>UTF-8</uriEncoding>
                            <server>tomcat7</server>
                        </configuration>
                </plugin>
	    </plugins>
	</build>
    ```
        * 项目对象模型中主要放置:
            项目自身信息,项目运行所以来的jar信息,运行环境信息(JDK,tomcat)
            
    2:依赖管理模型:Dependency
        其中项目对象里面放置项目运行所依赖的jar包信息独立出来,变成依赖管理模型。依赖管理模型里面放置的全都是jar包的坐标    
        ```
            <dependency>
			<groupId>javax.servlet.jsp</groupId>        1.公司组织的名称
			<artifactId>jsp-api</artifactId>            2.项目名
			<version>2.0</version>                      3.版本号
			<scope>provided</scope>
	    </dependency>
        ```
        jar包的信息最少由必要的三个基本信息组成:
            1.公司组织的名称
            2.项目名
            3.版本号
            
        * 当我们在运行一个maven工程的时候,永远第一步先从本地(local)仓库找jar包,
    第二包从远程仓库(b2b,私服)找jar包,第三部从中央仓库或者本地上传jar包
    。
    
    * 上面两个模型总体上是讲maven的第一大功能:依赖管理,即项目对jar包的管理过程。
    
    3.构建生命周期:
        * 最常用的是用来构建项目的默认生命周期:
            compile,test,package,install,depoly。
        *每一个命令都对应了maven底层的一个插件:
            构建生命周期需要很多插件的支持:构建项目时maven底层会有若干插件在工作。
            
    * 构建生命周期其实说的是maven的第二大功能:一键构建项目
    
    4.maven的概念模型图:
        展示了maven两大核心功能:底层分别都在怎么做。

二、Maven如何集成插件

    如果我们想使用IDEA来开发Maven工程,前提必须IDEA集成了安装好的Maven工具才可以。
那么要做IDEA集成Maven前提条件:本地必须有安装好的Maven。

* 1.解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
    原因:根据archetype创建maven项目会从网络下载catalog文件,导致创建maven项目缓慢
    
    IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令
    执行时,需要指定一个archetype-catalog.xml文件。

    该命令的参数-DarchetypeCatalog,可选值为:remote,internal  ,local等,用来
    指定archetype-catalog.xml文件从哪里获取。

    默认为remote,即从 http://repo1.maven.org/maven2/archetype-catalog.xml路径
    下载archetype-catalog.xml文件。
    
    http://repo1.maven.org/maven2/archetype-catalog.xml 文件约为3-4M,下载速度很慢,
    导致创建过程卡住。
    
    而且如果没有联网的话,就不能创建maven工程了。
    
    * 解决:
    在maven的VM Options加上-DarchetypeCatalog=internal参数,如下:
 
    
2.如何使用IDEA创建一个Maven的JAVA工程:使用骨架

    右侧是IDEA为我们提供好的很多直接可以创建出可以运行的Maven工程的骨架,也叫模版。 
如果要使用这些骨架,前提条件是可以联网;或者不联网但是你配置了从本地寻找骨架资源的属
性。
    要使用时,勾选上 Create from archetype。此时就可以使用右侧提供好的骨架。
    
    使用骨架来创建一个Maven的Java工程:
找到maven-archetype-quickstart,它就是IDEA为Maven提供好的创建Java工程的骨架。

    * 初次使用骨架创建maven工程,速度会较慢。要从网上下载创建maven骨架所需要的插件。
      而且目录结构少了src/main/resources和src/test/resources目录
    
3.如何使用IDEA创建一个Maven的JAVA工程:不使用骨架
    里面没有小demo,目录结构只少了src/test/resources
    
4.使用IDEA创建一个Maven的WEB工程

5.任何把一个包变成资源包

6.导入项目依赖的jar包
    我们刚才新创建的MavenWeb项目工程,这个项目中本来就一个jar都没有。需要我们手动导
入jar包,就要在web.xml写入依赖:
    ```
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>4.0.1</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
        </dependency>
      </dependencies>
    ```
    如果我们本地仓库有需要导入的jar包,那么我们写这些jar坐标时,IDEA给给出强大的提
示,写起来很方便。
    如果我们本地仓库没有jar包,那么我们就要去中央仓库:https://mvnrepository.com/
找到需要的jar包,然后将坐标和写到web.xml中,IDEA就会自动下载到仓库中。


Servlet定义了
web.xml也配置了(没用注解配置)
pom.xml中tomcat插件也配置了