0%

Maven

Maven,项目架构管理工具,方便我们管理jar包。

简介

为什么要学习这个技术?

  1. 在Javaweb开发中,需要使用大量的jar包,我们手动去导入很麻烦
  2. 如果能够让一个东西自动帮我们导入和配置这些jar包
    • Maven应运而生

Maven:项目架构管理工具,方便Java开发时导入jar包。详细介绍,见菜鸟教程

  • 核心思想:约定大于配置(有约束,不要去违反)
  • 会规定如何去编写Java代码,必须要按照这个规范来
  • 不仅仅是开发web应用程序时可以使用Maven进行构建项目

下载&安装

下载

官网:https://maven.apache.org/download.cgi。

下载完成后,解压即可。(建议这些资源包都放置在一个固定的文件夹中。)

配置环境变量

Windows系统,配置如下:

  • M2_HOME:maven目录下的bin目录(Spring等框架中使用)
  • MAVEN_HOME:maven目录
  • 在系统的path中配置%MAVEN_HOME%\bin

Mac系统,配置如下:

  • ~/.bash_profile是bash终端环境的配置文件,环境变量可放到里边。要使配置文件立即生效还需要执行命令source ~/.bash_profile,而且关闭终端窗口后需要再执行一遍才能生效。

  • ~/.zshrc是zsh终端环境的配置文件,环境变量可放到里边。每次开机都会默认执行该文件。要使配置文件立即生效还需要执行命令source ~/.zshrc。关闭终端窗口不影响。

步骤(在终端中进行配置):

  1. vim ~/.bash_profile。若没有这个文件,则新建一个。添加以下语句
    • export M2_HOME=/Users/qsdbl/Documents/Java/Maven/apache-maven-3.6.3/bin。maven目录下的bin目录
    • export MAVEN_HOME=/Users/qsdbl/Documents/Java/Maven/apache-maven-3.6.3。maven目录
    • export PATH=$PATH:$MAVEN_HOME/bin
  • 作用:添加程序所在的路径(主要是最后的PATH)
  1. vim ~/.zshrc。若没有这个文件,则新建一个。添加以下语句
    • source ~/.bash_profile。使.bash_profile配置文件立即生效(或将上边在.bash_profile中添加的语句添加到这里)
  • 作用:使”.bash_profile文件“开机生效
  1. source ~/.zshrc。使.zshrc配置文件立即生效

查看Maven是否安装成功,保证必须配置完毕!mvn -versionmvn -v

1
2
3
4
5
6
7
qsdbl@qsdbl hexo_blog % mysql -uroot -p123Cyj--
zsh: command not found: mysql
qsdbl@qsdbl hexo_blog % echo $path
/usr/local/sbin /usr/local/bin /usr/local/sbin /usr/local/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Applications/VMware Fusion.app/Contents/Public /Users/qsdbl/Documents/Java/Maven/apache-maven-3.6.3/bin
qsdbl@qsdbl hexo_blog % PATH="$PATH":/usr/local/mysql/bin
qsdbl@qsdbl hexo_blog % which mysql
/usr/local/mysql/bin/mysql

阿里云镜像

镜像:mirrors

  • 作用:加载下载
  • Maven目录/conf/settings.xml文件中添加阿里云镜像地址

国内建议使用阿里云的镜像(百度搜索一下就有)

1
2
3
4
5
6
7
8
9
<!-- 阿里镜像仓库 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>

本地仓库

在本地的仓库,远程仓库;

建立一个本地仓库:localRepository

1
<localRepository>/Users/qsdbl/Documents/Java/Maven/apache-maven-3.6.3/maven-repo</localRepository>

在IDEA中使用

SDK:Software Development Kit (软件开发工具包)

JDK:Java Development Kit (Java开发工具包;jdk属于sdk的一种)

使用maven模板创建项目

  1. 启动IDEA

  2. 创建一个Maven web项目

    点击+号,添加属性archetypeCatalog=internal

  3. 等待项目初始化完毕

    如上图,左侧出现警告⚠️。提示No archetype found in remote catalog. Defaulting to internal catalog,解决办法是:在前边选择maven文件那一步时,添加该属性archetypeCatalog=internal

  4. 观察maven仓库中多了什么东西

  5. IDEA中的maven设置

    注意:IDEA项目创建成功后,看一眼maven的配置

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

创建普通maven项目

这个地方不要勾选使用Maven模板(Create from archetype)。


上图是普通的Maven项目,pom文件中配置很少。下图是使用webapp模板创建的Maven项目。

新建文件夹

参考普通maven项目,在maven web项目中新建一些文件夹(缺少的)。新建文件夹后,鼠标右键标记文件夹。

标记后的文件夹,图标与普通文件夹有所不同。

或在“项目结构配置”中进行配置

配置Tomcat

Tomcat配置请看这篇博客:传送门

启动Javaweb项目

点击工具栏的绿色三角形即可启动Javaweb项目。

这里访问到的Hello World!是Tomcat的webapps文件夹下web应用程序文件夹内的index.jsp文件(构建项目自动生成的,输出文件在上图左侧的target文件夹内)。

在webapps文件夹下自动新建了一个web应用程序文件夹(刚刚创建artifacts时(见Tomcat笔记)填写的Application context

该文件夹内存放的就是一个web应用程序,里边一般都会有一个index.jsp(或index.html)文件和WEB-INF文件夹(见Tomcat笔记 )。

程序结构

web应用程序结构,一般根目录下有这些文件(编译后):

  • META-INF
  • WEB-INF
    • java代码(java文件夹内的,不包括java文件夹)
    • java代码相关的资源(resources文件夹内的,不包括resources文件夹)
    • 网站配置文件web.xml
    • 放一些机密文件(该目录下的文件用户是没有访问权限的
  • index.jsp
    • 网站首页
    • web应用程序开发时,webapp文件夹内我们建立的文件夹或文件(例如建立一个文件夹static,里边又建html、js、css、img等文件夹存放相应的静态文件)

打包后的web应用程序结构与开发时的项目结构是不一样的。开发时web应用程序各文件建议放的位置

注意:Maven构建项目,需要注意“约定大于配置”。其他文件放到代码文件夹(Java文件夹)中是不会被保存到打包生成的web应用程序中的,不过也可以通过配置pom.xml文件解决,具体解决方法点这里。但还是建议按照Maven的约定来,资源文件放到resources文件夹中,Java代码放到java文件夹中。

根目录

  • “/”代表当前web应用程序,对应开发时的webapp文件夹。
  • ../代表上一级页面。
  • JSP文件中,可以使用<%= pageContext.request.contextPath%>"request.getContextPath()"获取当前JSP页面所在的路径(下边的例子可以访问到放到与JSP页面同级的login程序)
    • 例如:"<%= request.getContextPath()%>/login"JSP标签
    • "${pageContext.request.contextPath}/login"EL表达式
    • 注意,是直接放到双引号内
    • 这里使用了JSP页面的两个内置对象,pageContext、request。

classpath

src/main下的java和resources文件夹中的内容在编译打包成web应用程序存放classpath中(不包括Java和resources文件夹)。

例如:classpath/db.properties 即可读取到开发时放到resources文件夹中的db.properties文件。classpath/包名.HelloServlet.class 即可读取到开发时写的某个类。(classpath要替换成/WEB-INF/classes

classpath = /WEB-INF/classesweb.xml同级(“/”代表当前web应用程序,对应开发时的webapp文件夹)。

web.xml

web.xml文件是web应用程序的核心配置(例如:配置Servlet映射Session超时配置过滤器配置等)。

总结

resources、java文件夹,编译后其中的文件,访问路径为classpath/文件名classpath=/WEB-INF/classes

webapp文件夹,编译后,其中的文件,访问路径为/文件名,有建多级文件夹来存放文件的则文件名前加上。

网站配置文件web.xml的访问路径为:/WEB-INF/web.xml

pom文件

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

pom文件详解

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
<?xml version="1.0" encoding="UTF-8"?>

<!--maven版本和头文件-->
<!--xmlns = xml namespaces,命名空间-->
<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,G-组ID(企业名),A-artifactId(可以理解为输出的web应用程序文件夹名),V-版本-->
<groupId>com.qsdbl</groupId>
<artifactId>javaweb_study01</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- package:项目的打包方式
jar:Java应用
war:Javaweb应用-->
<packaging>war</packaging>

<!-- 配置-->
<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包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

<!-- 项目构建用的东西-->
<build>
<!-- 在build中配置resources,来防止我们资源导出失败的问题(resources标签是我现在添加的)-->
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<!-- 资源导出时,java目录下的Java文件才会被导出(其他文件不能导出web程序就会出错)。下边的配置是包括properties、xml也一块导出-->
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<finalName>javaweb_study01</finalName>
</build>
</project>

导入依赖

自动导入

pom.xml文件中的dependencies标签内导入文件依赖,maven会帮我们导入(下载)该依赖和相关的依赖(jar包),没有自动下载可以点一下Maven界面的同步/更新按钮。(查找依赖点这里:传送门。怎么查找依赖可以看看博客后边的仓库使用笔记)

下边是Javaweb开发可能会用到的依赖:(dependencies标签放在project标签内,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
<dependencies>
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- JSTL表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库的依赖-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

依赖junit,用于单元测试。方法使用注解@Test,可以直接运行测试,而不通过main方法。详细笔记,点这里

因为是使用maven模板创建的Javaweb项目,所以pom.xml文件中有很多配置,而不使用模板创建项目会很干净,见下图。

手动导入

若因为网络的原因无法自动下载所需的包,我们还可以手动导入。前提是我们已经有这些包了(可以试试把Tomcat里的lib文件夹下的包导进来试试,说不定里边有我们需要的包。下边的例子中,我把整个lib文件夹都导进来了)

导出问题

maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件无法被导出或失效的问题。例如:Java文件夹内规定来存放的是Java文件,如果我们写了XML等配置文件在里头,导出资源时maven不会将它们导出。解决方法如下,在pom文件的<build>标签中配置resource。(详细解决办法见博客:传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<build>
.......
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
......
</build>

目录树

在Maven界面中,有一个目录树按钮,可以生成项目中用到的jar包的关联图。

打包

项目编译:IDEA打开项目,在侧栏中展开maven工具,分别使用clean,package命令完成打包。详情见这篇笔记

可能遇到的问题

目前并未发现问题。我使用的软件版本如下:

IDEA 2020.2

Tomcatapache-tomcat-9.0.39

Mavenapache-maven-3.6.3

JDK1.8jdk-8u261-macosx-x64

未能正常创建项目

使用Maven模版创建webapp项目,未能正常创建项目。Run提示框中报错,看下图:

解决办法:通过查看右侧框的错误提示,发现是自建的Maven仓库中的某个文件无效导致的。所以尝试将该文件删掉再重新创建新项目。结果问题解决。

Maven仓库的使用

地址:https://mvnrepository.com

在pom.xml文件的dependencies标签内导入jar依赖,maven会帮我们导入(下载)该依赖和相关的依赖。(参考前边的pom文件中的导入依赖)(当然,不通过maven,我们下载后之后添加进去也是可以的)

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道