• Java Web之Maven


    一、 概念

    Maven有什么用?

    • 构建项目
    • 管理jar包

    Maven的核心思想

    • 约定大于配置

    我们要按照Maven设定的规则来使用maven,这样才能达到好效果。


    二、使用

    (一)Maven的项目结构与模板

    1、标准的Maven项目结构

    在这里插入图片描述
    标准的Maven项目结构包含了源代码、测试类、POM文件。

    2、一些Maven archetype模板

    不管使用什么开发工具,只要它们使用了Maven,那么它们的基础项目结构都是统一的。在此基础之上,Maven为项目提供了各式各样的archetype模板,这些模板帮我们准备好了相应包含框架的基础项目结构。

    一般来说,Java Web项目就使用webapp模板
    在这里插入图片描述

    需要注意的是,Maven的任务是帮助我们构建项目,也就是说我们开发Web项目时的结构尽管可能各不相同,但我们Web项目打包后的结构基本相同

    (二)Maven的安装与配置

    1、Maven 的下载与安装

    • 下载:在官网直接下载bin压缩包。

    image.png

    • 安装:直接解压。

    开发习惯:我们开发用到的一些软件最好统一放到一个文件夹。


    2、Maven环境变量的配置

    • M2_HOME maven目录下的bin目录
    • MAVEN_HOME maven的目录
    • 在系统的path中配置 %MAVEN_HOME%\bin

    MAVEN_HOME是Maven 1.x使用,M2——HOME是Maven 2.x使用。

    当然,有直接在path中配置bin的完整目录的做法

    至于环境变量的目录理论上可以取任何名字,但以上命名已经形成了约定,一些软件会默认按照约定俗称的环境变量名去操作,所以建议使用以上环境变量名。

    提示:似乎官网并没有要求配置Maven环境变量

    在这里插入图片描述


    3、Maven仓库

    • 本地仓库(优先查找):默认 ~/.m2/repository
    • 远程仓库:中央仓库,镜像仓库,私服仓库

    ~被称为home家目录(一般指Admintrastor)。另外,中央仓库访问较慢,所以我们要手动配置以下镜像仓库,以阿里云为例。
    在config目录的settings.xml文件配置以下镜像。
    作用:加速jar包下载速度

    <mirror>
            <!--指定id-->
    	<id>alimaven</id>
    	<name>aliyun maven</name>
    	<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <!--它是哪个仓库的镜像-->
    	<mirrorOf>central</mirrorOf>
    </mirror>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    另外,本地仓库位置是自定义的,为了做到“把开发用的软件配置在同一目录”,我们要在settings.xml指定存放jar包的本地仓库,如下

    <localRepository>D:\Environment\apache-maven-3.8.4\maven-repo</localRepository>
    
    • 1

    使用时,注意在idea中配置maven,也就是告诉idea你的maven在哪。
    实际开发中,idea中的maven比命令行下的maven使用更简便。即使如此,有时我们甚至连idea中的maven命令也不使用, 而是 直接Build Project/Ctrl + F9

    这里我们仍然有必要学习一下cmd下,maven的命令

    一些命令

    • 查看maven版本
      mvn -version
    • maven项目的创建
      注意,我们想要在哪个文件夹创建maven项目,就要cd到哪个文件夹。
    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
    • 1

    archetype:generate指的是使用模板原型创建maven

    -DroupId=后面是组织id,一般为公司域名倒写 . 项目名

    -DartifactId=后面为项目id

    -DarchetypeArtifactId=生成项目的模板的id

    -DarchetypeVersion=模板版本

    DinteractiveMode=设置是否启用交互模式,启用后每执行一次就会询问yes/no。这里我们不启用。

    • maven的编译
      cd到项目的根目录内,才可以编译
    mvn compile
    
    • 1

    编译后会生成target文件夹

    • maven的清理
    mvn clean
    
    • 1

    甚至,可以清理后编译

    mvn clean compile
    
    • 1

    清理后测试

    mvn clean test
    
    • 1

    测试

    mvn test
    
    • 1

    想要测试必须要编译好,所以,test实际包含了编译功能。

    maven项目的一些特征

    • pom.xml
    • test文件夹
    • target文件夹

    target目录与打包

    从target目录一定程度上可以体现打包后的状况。
    在这里插入图片描述

    target目录是编译后生成的。

    在这里插入图片描述
    在这里插入图片描述

    项目打包后的jar包内没有web-inf文件夹,而war包则有。原因暂不清楚。
    打包后war包是一个标准的web应用目录,将其放在Tomcat的webapps目录下,tomcat运行时会自动解压部署。

    在idea中使用maven

    1.创建一个mavenweb项目
    在这里插入图片描述
    2. 在这里插入图片描述

    在这里插入图片描述

    这里idea能自动识别maven的路径是因为设置过了环境变量

    同时,从maven home path的下拉菜单可以看到idea也自带了maven

    4.创建成功在这里插入图片描述

    5.查看maven的设置

    在这里插入图片描述
    在这里插入图片描述

    6.到这里,Maven在IDEA中的配置和使用就ok了。

    创建一个普通的maven项目

    在这里插入图片描述

    以下是使用maven的webapp模板创建的

    在这里插入图片描述

    标记文件夹

    当在创建普通的maven项目的文件夹后,如有需要可以自定义对文件夹进行标记。这样其实和通过模板创建的项目的文件夹是一个效果。

    同样,也可以在以下页面标记文件夹

    在这里插入图片描述

    pom文件

    pom.xml 是Maven的核心配置文件

    有时为了防止出错头文件版本一般和tomcat里面项目示例的版本一样。

    <?xml version="1.0" encoding="UTF-8"?>
    <!--Maven版本和头文件-->
    <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>
    <!--这里就是我们刚才配置的GAV-->
      <groupId>com.kuangstudy</groupId>
      <artifactId>javaweb-01-maven</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <!--package:项目的打包方式
      jar:java应用
      war:javaweb应用-->
      <packaging>war</packaging>
    	<!-- 这个name url其实删了没影响-->
      <name>javaweb-01-maven Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <!--配置-->
      <properties>
        <!--项目的默认构建编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--编码版本-->
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <!--项目依赖-->
      <dependencies>
        <!--具体依赖的jar包配置文件-->
        <!--maven的高级之处在于,他会帮你导入这个jar包所依赖的其他jar-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    <!--项目构建用的东西-->
      <build>
        <finalName>javaweb-01-maven</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,

    注:由上,我们创建maven时,一般并不通过模板创建。

    解决方案:

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
    <resources>
    <resource>
    <directory>src/main/resources</directory>
    <includes>
    <include>**/*.properties</include>
    <include>**/*.xml</include>
    </includes>
    <filtering>true</filtering>
    </resource>
    <resource>
    <directory>src/main/java</directory>
    <includes>
    <include>**/*.properties</include>
    <include>**/*.xml</include>
    </includes>
    <filtering>true</filtering>
    </resource>
    </resources>
    </build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    遇到的问题

    ·IDEA中每次都要重复配置Maven
    在IDEA中的全局默认配置中去配置,以下为idea2020.3版本

    在这里插入图片描述
    在这里插入图片描述

    效果

    会查找servlet所需的依赖jar包


    在这里插入图片描述

    scope是作用域的意思,但实际上scope可以删除。

  • 相关阅读:
    Allegro Design Entry HDL(OrCAD Capture HDL)原理图是设计快速入门图文教程
    AI医疗高精尖!基于AI的新药研发!
    flex布局与几个实例(含源码)
    python接口自动化-参数关联
    2023首都师范大学计算机考研信息汇总
    upload-labs靶场通关指南(第1-3关)
    Python基础入门例程59-NP59 提前结束的循环(循环语句)
    27岁了,目前从事软件测试,听说测试前途是IT里最差的,是这样吗?
    ESP32网络开发实例-BME280传感器数据保存到InfluxDB时序数据库
    纽交所上市公司安费诺宣布将以1.397亿美元收购无线解决方案提供商PCTEL
  • 原文地址:https://blog.csdn.net/smartedge/article/details/125492245