Maven
为什么要学习maven ?
- 在javaweb开发中,需要使用大量的jar包,需要我们去导入。
- 如何能够让一个东西自动帮我们导入和配置jar包,由此,maven诞生
Maven项目架构管理工具
我们目前用来就是方便导入jar包的。
Maven的核心思想:约定大于配置。(有约束,不要去违反)
-
约定: 能够满足大多数人习惯的约定就是一种好的约定,而在程序中,能够简化代码实现,使代码高可用的约定就是一种好的约定。
-
约定大于配置: 就是在开发中,如果有些值你没有配置的话,那程序会取一个默认值,换句话说,能取默认值的配置,就不需要配置了,这个默认值就是约定,约定可以减少很多配置。
-
在maven的结构中:
- /src/main/java目录用来存放java源文件
- src/main/resources目录用来存放资源文件,如application.yml文件和properties文件等。
- /src/test/java目录用来存放java测试文件
- /src/test/resources目录用来存放测试资源文件
- /src/test/resources目录用来存放测试资源文件
-
maven为你做了很多事情,只是它都对用户隐藏了起来,你只需要遵循它的约定即可
-
约定大于配置是一个简单的概念。系统,类库,框架假定其合理的默认值,而非要求提供不必要的配置。在大部分情况下,使用框架提供的默认值会让项目运行的更快。
下载安装maven
官网: 点击进入
下载后解压安装即可。
配置环境变量
在我们的系统环境变量中,配置如下变量:
- M2_HOME (maven目录下的bin目录)
- MAVEN_HOME (maven的目录)
以我的maven配置目录示例:
- 在系统的Path中配置 %MAVEN_HOME%\bin
验证是否配置成功:
打开cmd窗口输入: mvn-version
出现以下内容即 配置成功!
修改maven的settings.xml为阿里云镜像
-
镜像: mirrors
- 作用: 加速我们相应jar包的下载
-
国内建议使用阿里云的镜像
<mirror>
<id>alimaven</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
在maven的settings.xml配置本地仓库
建立一个本地仓库: localRepository
<localRepository>D:\SoftWare\apache-maven-3.8.1\maven-repo</localRepository>
其会在相应路径下生成一个名叫maven-repo的本地仓库文件夹。
在IDEA中使用MAVEN
创建一个Mavenweb模板项目
- 启动IDEA
- 以创建一个Maven webapp应用模板项目示例
- IDEA中Maven设置,IDEA项目创建成功后,看一眼Maven的配置
到这里,Maven创建模板项目的配置和使用就OK了!
注意: 这里使用maven模板创建web应用项目的话,创建出来的web应用的web.xml配置文件版本是过时的,需要手动更换成新版本的web.xml。
创建一个不带模板的普通的Maven项目
所以当前没有选择模板创建的空白maven项目目录结构如下:
如下这个web目录只有在创建web应用下才会有:
此时若想要在当前空白maven项目中创建web应用,可以在项目目录右键选择添加框架支持,选择webApplication即可:
发现此时目录结构多了个web目录,即代表当前是一个web应用了
标记文件夹功能
- 方式一:
- 方式二:
pom文件
pom.xml是Maven的核心配置文件
<?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>
<!-- 这里就是刚创建Maven项目时设置的GAV,group/artifact/version-->
<groupId>com.carson</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- packaging:代表项目的打包方式-->
<!-- jar格式:代表java应用 war格式:代表JavaWeb项目-->
<packaging>war</packaging>
<!-- properities:代表配置-->
<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:项目依赖-->
<dependencies>
<!-- dependency:具体依赖的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5-20081211</version>
</dependency>
</dependencies>
<!-- 项目构建用的东西-->
<build>
<finalName>javaweb-01-maven</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<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>
关于在Maven项目中配置资源文件导出问题
标准的Maven项目都会有一个resources目录来存放我们所有的资源配置文件,但是我们往往在项目中不仅仅会把所有的资源配置文件都放在resources中,同时我们也有可能放在项目中的其他位置,那么默认的maven项目构建编译时就不会把我们其他目录下的资源配置文件导出到target目录中,就会导致我们的资源配置文件读取失败,从而导致我们的项目报错出现异常,比如说尤其我们在使用MyBatis框架时,往往Mapper.xml配置文件都会放在dao包中和dao接口类放在一起的,那么执行程序的时候,其中的xml配置文件就一定会读取失败,不会生成到maven的target目录中,所以我们要在项目的pom.xml文件中进行设置,并且我建议大家,每新建一个maven项目,就把该设置导入pom.xml文件中,以防不测!!!
解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<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项目,就把该设置导入pom.xml文件中,以防不测!
IDea操作之 生成目录树
Maven中父子工程的理解
- 构建一个普通的maven项目,删掉里面的src目录,这个就是我们的maven主工程; 在主工程里利用maven新建的model模块,这些模块就是Maven的子工程。
如上为例:
- javaweb-02-servlet代表的就是Maven父工程
- 各个模块:request,response,servlet-01,servlet-02等代表各个子工程。
- 父项目中的pom.xml中会有对子工程的描述:
<!--父项目中会有关于子模块的modules备注说明-->
<modules>
<module>servlet-01</module>
<module>servlet-02</module>
<module>response</module>
<module>request</module>
</modules>
- 子项目的pom.xml中会有对其父项目的描述:
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.carson</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
- 故子项目可以直接使用父项目中导入的依赖。即(Son extends Father)
IDEA中Maven环境优化
- 如果是利用maven创建的web应用,需要修改其web.xml为最新的内容,即修改成如下内容,防止出现问题:
<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml中是配置我们web应用的核心配置-->
<!--替换为webapp4.0版本和tomcat一致-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
- 将Maven的结构搭建完整
(新建java文件夹和resources文件夹,并进行相应文件夹的标记)
最后完成的结果:
Maven项目运行web应用ClassNotFound问题解决
一般我们在以Maven项目为基础创建的Web应用,在pom.xml
中
虽然已经导入了所有的所需的依赖包,但当启动Tomcat运行Web应用时,会出现ClassNotFound等找不到相关依赖的错误
类似如下错误:
解决办法:
1.打开Project Structure
,选择Artifact
,再选择相应的war包
发现WEB-INF目录下只有classes目录。
2. 选择如下图标,在WEB-INF
目录下创建一个lib目录
3.选中lib目录
,再选择+号图标
再选择Library Files
再全选所有依赖
,点击Ok
即可。
最终发现Lib目录下成功多了许多的依赖,这样就不会出现上面那个错误了!!
问题解决!!!
The End!!创作不易,欢迎点赞/评论!!欢迎关注个人公众号