0


Maven总结

声明:部分图片来自百战程序员

目录


重点:web工程的jsp页面默认是访问webapp目录下的页面

我们可以通过几点来对Maven进行总结

Maven的作用

一键构建

我们的项目往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程,这些过程称之为构建。通过Maven工具,可以使用 简单的命令轻松完成构建工作。

依赖管理

传统的Web项目中,我们必须将工程所依赖的jar包复制到工程中,导致了工程的变得很大。如果一个公司具有相同架构的项目有十个,那么就需要将这一份jar包复制到十个不同的工程中,非常浪费资源。

Maven的运行原理

传统Web项目中大部分磁盘空间是被jar包占据,而Maven项目中一定没有jar包,那没有jar包的项目是怎么运行的呢?

583e93f3df794fafa6de724775dfc16f.png

maven工程中不直接将jar包导入到工程中,而是有一个专门存放jar包的仓库,仓库中的每个jar包都有自己的坐标。maven工程中只要配置jar包坐标即可,运行项目需要使用jar包时,根据坐标即可从maven仓库中拿到jar包即可运行。

Maven工程的类型和结构

Maven工程类型

  • POM工程 POM工程是逻辑工程,Maven并不会对该类型工程做打包处理,这些工程往往不包含具体的业务,而是用来整合其他工程的。
  • JAR工程 普通Java工程,在打包时会将项目打成jar包。
  • WAR工程 JAVA Web工程,在打包时会将项目打成war包。

Maven工程结构

接下来我们通过一个WAR工程学习Maven工程的结构

文件目录结构:

4299bae98d8349fb9a3f7691d36e0887.png

  • src:源代码
  • target:编译生成的文件
  • pom.xml:Maven工程配置文件,如坐标信息等。

项目结构:

413288a9c55444d6befcdfda6fc8c0d8.png

仓库类型

本地仓库

本地仓库指用户计算机中的文件夹。用来存储从远程仓库或中央仓库下载的jar包,只有下载到本地仓库的jar包才能使用,项目使用jar包时优先从本地仓库查找。

远程仓库

远程仓库一般指私服,它是架设在局域网的仓库服务,可以从中央仓库下载资源,供局域网使用,从而减少每个程序员都从中央仓库下载浪费的带宽。

如果项目需要的jar包本地仓库没有,则会去远程仓库下载,下载到本地仓库即可使用。

远程仓库不是必须配置的,如果本地仓库没有jar包,也没有配置远程仓库,则会直接从中央仓库下载。

中央仓库

中央仓库是互联网上的服务器,是Maven提供的最大的仓库,里面拥有最全的jar包资源。

如果项目需要的jar包,本地仓库和远程仓库都没有,则会去中央仓库下载,下载到本地仓库使用。

Maven中央仓库访问页面: https://mvnrepository.com/

中央仓库访问速度较慢,我们一般都会配置镜像代理中央仓库的下载请求,如阿里镜像、华为镜像等。

Settings配置文件

配置本地仓库

在<settings>中添加如下标签:

<localRepository>F://repository</localRepository>

配置镜像

由于中央仓库访问速度较慢,可以配置镜像代理中央仓库的下载请求。在<settings>下的<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>

配置JDK版本

创建maven项目的时候,默认使用的JDK是1.5版本,验证语法、编译、运行时都会按照JDK1.5操作,所以很多小伙伴经常在运行的时候汇报版本太低异常。我本机安装的JDK是JDK11,可以配置maven按照JDK11创建项目。

在<settings>下的<profiles>中添加如下标签即可配置JDK版本:

<profile>
  <id>jdk11</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>11</jdk>
  </activation>
  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
  </properties>
</profile>

安装maven

maven是apache的开源项目,所以如果想要下载maven的话,那么可以直接去apache的官网寻找下载
Apache DownloadsHome page of The Apache Software Foundationhttps://maven.apache.org/download.cgi%E5%8D%B3%E5%8F%AF%E5%AE%8C%E6%88%90%E4%B8%8B%E8%BD%BD

配置环境变量

由于Maven是由Java语言开发的,运行时依赖Java环境,所以要在计算机的环境变量中配置JAVA_HOME

d9143cc327b040b1ade528555377d1b3.png

为了更方便的使用Maven命令,需要在环境变量中配置MAVEN_HOME和Path

c6b4cca3b27248f78b054825fe735e07.png

2185e392ca6a494386be94d6ad7a4c8d.png

查看版本

打开CMD命令窗口,输入mvn -v,显示Maven版本和Java版本,证明安装成功

69b6e730e87c41d093c8528556d8c413.png

把maven配置到idea里

idea的设置(Settings)中配置maven插件

Maven home directory就是maven的根目录

User settings file就是Maven的配置文件,它位于maven根目录下conf目录下

Local repository就是本地仓库

9fdd14d1b4314a39b9428f812a478d80.png

maven里的一些标签,,,需要知道这里面需要放什么。groupId,artifactId,version是什么,版本号对应的数字代码什么

parent标签代表父工程(相当于java的继承,但是只能单继承),

dependencies标签代表依赖(相当于java的继承,可通过依赖模拟出多继承),

plugins标签代表插件

groupId:是项目src目录下main目录下java目录下的项目结构,实际对应JAVA的包的结构

001a16526050498abd1f23a641133627.png

** ArtifactId:**是项目的名称

1a1b2dea66ae41a7a4b140ba3b58cd55.png

Version :是项目的版本号

1.0-SNAPSHOT 。其中1.0是版本号,SNAPSHOT版本代表不稳定、尚处于开发中的版本。而衍生的有Release版本则代表稳定的版本

jar包的依赖范围

访问servlet后,发现报500异常,这是为什么呢?

3fc9004dbff64bf8b5d6bd0f7140ba53.png

这是由于项目中引入了Servlet和Jsp的jar包,而在项目运行时,Tomcat要使用它自带的Servlet和Jsp的jar包,这样就造成了jar包冲突。但如果项目不引入Servlet和Jsp的jar包,则根本无法通过编译。

此时可以设置依赖的作用范围解决该问题,设置Servlet和Jsp的jar包只在编译期起作用,运行时不起作用,这样不仅可以通过编译,还能在运行时避免jar包冲突。

通过在<dependency>中添加<scope>,可以设置依赖的作用范围,有以下取值:

<dependency>

  <groupId>javax.servlet.jsp</groupId>

  <artifactId>jsp-api</artifactId>

  <version>2.2</version>

  <scope>provided</scope>

</dependency>

<dependency>

  <groupId>javax.servlet</groupId>

  <artifactId>javax.servlet-api</artifactId>

  <version>3.0.1</version>

  <scope>provided</scope>

</dependency>

所以对于Servlet和Jsp依赖,我们添加依赖范围为provided即可。

  • compile 默认范围。表示该依赖在编译和运行时生效,项目打包时也会将该依赖打包进去。
  • provided 使用此依赖范围的Maven依赖,编译和测试时有效,但在运行时无效。典型的例子是servlet-api,在运行时Web容器已经提供依赖,就不需要Maven重复地引入一遍。
  • runtime runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动包,编译时只需要JDK的JDBC接口即可,只有运行项目时才需要具体的JDBC驱动。
  • test test范围表明使用此依赖范围的依赖,只在编译和运行测试代码的时生效,程序的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。
  • system 如果有些你依赖的jar包没有Maven坐标的,它完全不在Maven体系中,这时候你可以把它下载到本地硬盘,然后通过system来引用。(不推荐使用)

maven的继承

Maven聚合开发_继承关系

Maven中的继承是针对于父工程和子工程。父工程定义的依赖和插件子工程可以直接使用。注意父工程类型一定为POM类型工程

多继承

Maven中对于继承采用的也是单继承,也就是说一个子项目只能有一个父项目。但我们可以在<dependencyManagement>配置多继承。写法如下:

<dependencyManagement>

  <dependencies>

    <!--父项目a-->

    <dependency>

      <groupId>com.itbaizhan</groupId>

      <artifactId>parent_a</artifactId>

      <version>1.0-SNAPSHOT</version*>

      <type>pom</type>

      <!-- 引入父项目,scope的值为import -->

      <scope>import</scope>

    </dependency>

    <!--父项目b-->

    <dependency>

      <groupId>com.itbaizhan</groupId>

      <artifactId>parent_b</artifactId>

      <version>1.0-SNAPSHOT</version>

      <type>pom</type>

      <scope>import</scope>

    </dependency>

  </dependencies>

</dependencyManagement>

创建聚合项目

e0d30bce405749b4b271a3a7b84f8bf9.png


本文转载自: https://blog.csdn.net/cccccccmmm/article/details/127035109
版权归原作者 c_mmmmmmm 所有, 如有侵权,请联系我们删除。

“Maven总结”的评论:

还没有评论