Day59

Maven使用教程

一、概要

1、什么是maven?

2、maven的作用

3、maven的安装与配置

4、idea构建maven项目

5、什么是maven仓库/坐标?

6、maven依赖管理

7、mave插件使用

8、maven继承和聚合

9、maven搭建ssm项目案例

二、聚焦知识点

1、什么是maven?

Maven 读音是 [ˈmevən],也就是“霉文”,而不是读“马文”。Maven是基于项目对象模型(POM Project Object Model),可以通过一小段描述信息(配置文件)来管理项目的构建、报告和文档的软件项目管理工具。

其官网地址为:http://maven.apache.org

Maven翻译为“专家”、“内行”;是一个采用纯Java编写的开源项目管理工具,Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个声明周期,包括清除、编译、测试、报告、打包、部署等。目前Apache下绝大多数项目都已经采用Maven进行管理. 而Maven本身还支持多种插件,可以方便更灵活的控制项目, 开发人员的主要任务应该是关注业务逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去依赖jar包、项目部署等。Maven正是为了将开发人员从这些任务中解脱出来而诞生的一个项目管理工具。

总结:

Maven 是专门用于构建和管理Java相关项目的工具。

Maven是意第绪语,依地语(犹太人使用的国际语),表示专家的意思。

所以用Maven管理Java 项目,你就是专家了 ^_^

2、maven的作用

传统方式管理jar依赖的问题:

  • jar冲突
  • jar依赖
  • jar体积过大
  • jar在不同阶段无法个性化配置

使用maven方式管理jar依赖的好处:

  • 解决jar冲突
  • 解决jar依赖问题
  • jar文件不用在每个项目保存,只需要放在仓库即可
  • maven可以指定jar的依赖范围

3、maven的安装与配置

3.1、下载Maven

下载地址:Maven – Download Apache Maven

具体地址:Index of /apache/maven

0

3.2、解压

解压maven压缩包“apache-maven-3.5.2.bin.zip”到一个路径(尽量编码路径中不要包含中文)

0

  • bin:含有mvn运行的脚本
  • boot:含有plexus-classworlds类加载器框架
  • lib:含有Maven运行时所需要的java类库
  • conf:含有settings.xml配置文件
  • settings.xml 中默认的用户库: ${user.home}/.m2/repository[通过maven下载的jar

包都会存储到此仓库中]

3.3、添加环境变量MAVEN_HOME

MAVEN_HOME : D:\apache-maven-3.6.3 (注意:配置为你自己的maven路径)

0

下面这个配置跟第一个配置一样,只不过有些项目自动获取的maven环境变量名默认为M2_HOME

0

3.4、设置系统环境变量path

在Path中追加: %MAVEN_HOME%\bin 以及 %M2_HOME%\bin

0

3.5、验证是否安装成功

打开 cmd 输入:mvn -version

0

3.6、 配置本地仓库

Maven的默认本地仓库在:${user.home}/.m2/repository;这地址可以在settings.xml中修改指定自定义的仓库路径。

【自定义仓库路径】

找到${maven_home}/conf/settings.xml文件,修改如下:

0

需要注意的是上图中的自定义路径必须存在。repository是本地仓库,也即本地下载的jar存放路径。

配置阿里中央仓库下载地址 在mirrors标签中配置

<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>

4、idea构建maven项目

4.1、配置全局maven

0

0

0

上一步选Runner,JRE选本地安装的JDK,然后在VM Options:输入

-Dmaven.wagon.http.ssl.insecure=true

-Dmaven.wagon.http.ssl.allowall=true

-Dmaven.wagon.http.ssl.ignore.validity.dates=true

取消自动下载时的证书校验:解决Could not transfer metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml fro_全干工程师呀的博客-CSDN博客

4.2、创建Maven自带Java项目

0

0

0

框中的是可以改变的内容,我们先默认后面讲这里的配置信息

0

创建完后的项目目录

0

注意:当进到idea项目页面后,maven会自动下载一些依赖的插件,这个时候右下角会有下载进度条,一定要待进度条走完没有任何下载信息提示的时候再进行其他的操作。

要让项目加载快点:让 maven 下载archetype-catalog.xml 快一点 附下载链接_liuqiuhai3637的博客-CSDN博客_archetype-catalog.xml

archetype-catalog.xml

4.3、创建Maven自带Web项目

0

0

0

5、什么是maven仓库/坐标?

Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,就称之为仓库。(仓库就是存放依赖和插件的地方)Maven的仓库有两大类:

  1. 本地仓库
  2. 远程仓库,在远程仓库中又分成了3种:中央仓库、私服、其它公共库。

本地仓库:就是Maven在本机存储构件的地方。maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建。maven本地仓库的默认位置:在用户的目录下都只有一个.m2/repository/的仓库目录;可以修改。

中央仓库:包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。开源的Java项目依赖的构件都可以在这里下载到。

中央仓库的地址:http://repo1.maven.org/maven2/

私服:是一种特殊的远程仓库,它是架设在局域网内的仓库。

没有使用私服的仓库构件下载

0

使用私服的仓库构件下载

0

5.1、什么是maven坐标?

在平面几何中坐标(x,y)可以标识平面中唯一的一点

5.2、Maven坐标主要组成

groupId:定义当前Maven项目隶属项目、组织

artifactId:定义实际项目中的一个模块

version:定义当前项目的当前版本

packaging:定义该项目的打包方式(pom/jar/war,默认为jar)

groupId、artifactId、version简称为GAV。

5.3、Maven为什么使用坐标?

Maven世界拥有大量构件,需要找一个用来唯一标识一个构建的统一规范

拥有了统一规范,就可以把查找工作交给机器

5.4、如何获取Maven坐标

推荐一个Maven坐标查询网站:http://mvnrepository.com/

网站上可以搜索具体的组织或项目关键字,之后复制对应的坐标到pom.xml中。如:

0

6、maven依赖管理

6.1、依赖范围

依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系。具体的依赖范围有如下6种:

  1. compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2. test:测试依赖范围。只对于测试classpath有效
  3. provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  4. runtime:运行时提供。例如:jdbc驱动
  5. system:系统范围,自定义构件,指定systemPath;跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
  6. import:只使用在中,表示从其它的pom中导入dependency的配置。

0

6.2、传递性依赖

假设 C 依赖 B , B 依赖 A ,那么称 C 对 B 是第一直接依赖, B 对 A 是第二直接依赖, C 对 A 是传递依赖。

对于传递性依赖,依赖的范围如下表:

0

6.3、可选依赖

在依赖节点dependency中的可以控制当前的依赖是否向下传递;默认值为false,表示向下传递。

【示例】A项目依赖于log4j,然后B项目依赖于A项目;那么如果在A中对log4j依赖的optional配置成false时,B项目中自动传递依赖于log4j。否则反之。

1)项目A配置slf4j的依赖并设置optional为true

 <dependency>             <groupId>org.slf4j</groupId>             <artifactId>slf4j-log4j12</artifactId>             <version>1.6.4</version>             <!-- 配置为true时不向下传递此依赖,默认为false -->             <optional>true</optional>  </dependency>

2)配置项目B依赖于项目A,检查项目B的依赖包

<!-- 依赖于A --> <dependency>         <groupId>com.yiidian</groupId>         <artifactId>A</artifactId>          <version>0.0.1-SNAPSHOT</version> </dependency>

这时发现B项目没有依赖slf4j-log4j12

6.4、依赖冲突

  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)

0

最终A依赖的X的版本为2.0

【比如】:项目A中,依赖了slf4j1.6.4版本的包,通过slf4j1.6.4间接依赖log4j1.2.16版本;如果项目A中直接配置了log4j 1.2.17版本,那么最终的版本为1.2.17。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> <!-- 配置为true时不向下传递此依赖,默认为false --> <optional>true</optional> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准

0

  • 如果间接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序上方的版本为准

           如下对应spring-core的间接依赖的版本号,以struts2-spring-plugin为准

<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>

6.5、排除依赖

在pom中的依赖节点中,如果引入的依赖包含了很多其它的传递依赖,而且项目需要的这些依赖的版本和传递依赖的不相符;那么可以在依赖节点中设置排除依赖节点: 然后再添加 ,其里面的内容包括:

①所包含坐标

②排除依赖包中所包含的依赖关系

【注意】不需要添加版本,直接按照类别排除

<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> <exclusions> <!-- 排除spring-core的传递依赖 --> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>

在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了。这也是一个比较操蛋烦人的事情,但是有idea这么个神器,解决maven jar包冲突呐还不是随随便便的事情吗?

0

·标注一:Maven Project,Maven 项目选项;

·标注二:Dependencies,项目依赖;

·标注三:Show Dependencies,展示项目依赖图

点击Show Dependencies 按钮之后,接下来就会出现以下内容。

0

在我们发现jar包冲突之后,就可以通过exclusion进行冲突的解决。

7、mave插件使用

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

每个插件都能实现多个功能,每个功能就是一个插件目标。Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。例如;compile就是插件maven-compiler-plugin的一个插件目标。

7.1、添加打包项目源码的插件;运行install命令后在仓库中有项目的源码jar包

<build> <plugins> <!-- 配置打项目源码包的插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <goals> <goal>jar-no-fork</goal> </goals> <phase>verify</phase> </execution> </executions> </plugin> </plugins> </build>

7.2、添加tomcat插件;以后可以针对项目快速配置多个不同端口的tomcat

<!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8081</port> <path>/</path> </configuration> </plugin>

运行tomcat;右击项目或者pom.xml,选择Run as --> Maven build...

0

7.3、修改JDK编译版本

<build> <plugins> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>

8、maven继承和聚合

8.1、父子聚合项目

通过 maven 可以创建父子-聚合项目。 所谓的父子项目,即有一个父项目,有多个子项目。这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享。所以常用的做法会把重复的 jar 包都放在父项目下进行依赖,那么子项目就无需再去依赖这些重复的 jar 包了。

8.2、新建项目

如同上面的4.2创建maven自带的java项目

0

8.3、项目参数

0

0

8.4、修改pom.xml

idea 自动生成的 pom.xml 有一大堆东西,很多都用不着。 修改为如下的内容。

1. 默认是 jar, 修改为pom。 这样才可以作为父项目存在。

<packaging>pom</packaging>

2. 增加 hutool jar 和 junit 包的依赖,用于后来子项目里观察对其的调用。

<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.how2j</groupId> <artifactId>parentMavenProject</artifactId> <version>0.0.1-SNAPSHOT</version> <name>parentMavenProject</name> <description>parentMavenProject</description> <packaging>pom</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.3.1</version> </dependency> </dependencies> </project>

8.5、创建子项目

所谓的子项目,其实是maven module.

右键点击 parentMavenProject->New->Module.

0

接下来的步骤跟上面的步骤一样

TestHutool

在 childMavenProject 下新建 TestHutool类,并运行。

可以发现,是可以使用 hutool jar 里的类的。 这说明子项目,能够使用 父项目中的 jar 包了。

public class TestHutool {     public static void main(String[] args) {         String dateStr = "2012-12-12 12:12:12";         Date date = DateUtil.parse(dateStr);         System.out.println(date);     } }

0

8.6、子项目的pom.xml

观察子项目的 pom.xml ,可以发现它多了个 parent, 这个就是对父项目的依赖。

<parent> <artifactId>parentMavenProject</artifactId> <groupId>cn.how2j</groupId> <version>0.0.1-SNAPSHOT</version> </parent>

0

8.7、父项目的pom.xml

此时再打开父项目的 pom.xml ,可以发现它多了这么一个模块s, 就表示对子项目的关联。

<modules> <module>childMavenProject</module> </modules>

0

8.8、项目结构

观察目录结构,可以发现 childMavenProject 是位于 parentMavenProject下面的。 所以如果将来有 childMavenProject1, childMavenProject2, childMavenProject3 也会放在这么一个目录下,就方便管理了。

0

9、maven搭建ssm项目案例

<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>maven-demo-test</artifactId> <version>1.0-SNAPSHOT</version> <name>maven-demo-test</name> <packaging>war</packaging> <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <junit.version>5.7.1</junit.version> <spring.version>5.2.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!--Spring核心基础依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <!-- 增加了切面 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!--spring mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!--mybatis相关--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- 与spring整合 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- 连接池 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.7</version> </dependency> <!--jstl, 标签库--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!--日志相关--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <!--测试相关--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--通过注解生成get和set方法--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!-- json解析的依赖 在我们接口返回实体类的时候,需要用到 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.3</version> </dependency> <!--alibaba提供的json工具,将对象和JSONObject相互转换--> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> </dependencies> <build> <!-- 把src/main/java目录下所有的xml文件都包含进去,其中${basedir} 是MAVEN的内置变量,表示项目根目录。 同样,想包含其他什么文件,比如.properties文件,再加一个<include>标签类似的写法即可。 --> <finalName>mapperFile</finalName> <resources> <resource> <directory>${basedir}/src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.0</version> </plugin> </plugins> </build> </project>

0

①、项目需要的配置文件

②、静态资源文件

③、jsp页面的位置

ssm 整合不导包 Cannot resolve org.springframework:spring-jcl:5.0.10.RELEASE解决方法_mohan_zhao的博客-CSDN博客

解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件

解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件_Beauxie的博客-CSDN博客_target里没有mapper

闭坑

关于验证拦截的设置

这个是证书出现问题,只要在idea的这个位置加上:

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

解决Could not transfer metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml fro_全干工程师呀的博客-CSDN博客

maven插件设置编译环境

使用maven-compiler-plugin插件,在pom文件设置默认的jdk编译版本(以JDK1.8为例)_gao_jun1的博客-CSDN博客

Maven下载jar包出现.lastUpdated结尾的文件

出现.lastUpdated文件原因:由于网络原因没有将Maven的依赖下载完整导致。

解决方案:

删除所有以 .lastUpdate 结尾的文件。

a) 进入到自己 maven 的本地仓库

b) 在当前本地仓库目录打开 cmd 命令行

c) Windows执行命令:

for /r %i in (*.lastUpdated) do del %i

6.4、依赖冲突

  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)

0

最终A依赖的X的版本为2.0

【比如】:项目A中,依赖了slf4j1.6.4版本的包,通过slf4j1.6.4间接依赖log4j1.2.16版本;如果项目A中直接配置了log4j 1.2.17版本,那么最终的版本为1.2.17。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> <!-- 配置为true时不向下传递此依赖,默认为false --> <optional>true</optional> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准

0

  • 如果间接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序上方的版本为准

           如下对应spring-core的间接依赖的版本号,以struts2-spring-plugin为准

<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>

6.5、排除依赖

在pom中的依赖节点中,如果引入的依赖包含了很多其它的传递依赖,而且项目需要的这些依赖的版本和传递依赖的不相符;那么可以在依赖节点中设置排除依赖节点: 然后再添加 ,其里面的内容包括:

①所包含坐标

②排除依赖包中所包含的依赖关系

【注意】不需要添加版本,直接按照类别排除

<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> <exclusions> <!-- 排除spring-core的传递依赖 --> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>

在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了。这也是一个比较操蛋烦人的事情,但是有idea这么个神器,解决maven jar包冲突呐还不是随随便便的事情吗?

0

·标注一:Maven Project,Maven 项目选项;

·标注二:Dependencies,项目依赖;

·标注三:Show Dependencies,展示项目依赖图

点击Show Dependencies 按钮之后,接下来就会出现以下内容。

0

在我们发现jar包冲突之后,就可以通过exclusion进行冲突的解决。

7、mave插件使用

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

每个插件都能实现多个功能,每个功能就是一个插件目标。Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。例如;compile就是插件maven-compiler-plugin的一个插件目标。

7.1、添加打包项目源码的插件;运行install命令后在仓库中有项目的源码jar包

<build> <plugins> <!-- 配置打项目源码包的插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <goals> <goal>jar-no-fork</goal> </goals> <phase>verify</phase> </execution> </executions> </plugin> </plugins> </build>

7.2、添加tomcat插件;以后可以针对项目快速配置多个不同端口的tomcat

<!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8081</port> <path>/</path> </configuration> </plugin>

运行tomcat;右击项目或者pom.xml,选择Run as --> Maven build...

0

7.3、修改JDK编译版本

<build> <plugins> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>

8、maven继承和聚合

8.1、父子聚合项目

通过 maven 可以创建父子-聚合项目。 所谓的父子项目,即有一个父项目,有多个子项目。这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享。所以常用的做法会把重复的 jar 包都放在父项目下进行依赖,那么子项目就无需再去依赖这些重复的 jar 包了。

8.2、新建项目

如同上面的4.2创建maven自带的java项目

0

8.3、项目参数

0

0

8.4、修改pom.xml

idea 自动生成的 pom.xml 有一大堆东西,很多都用不着。 修改为如下的内容。

1. 默认是 jar, 修改为pom。 这样才可以作为父项目存在。

<packaging>pom</packaging>

2. 增加 hutool jar 和 junit 包的依赖,用于后来子项目里观察对其的调用。

<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.how2j</groupId> <artifactId>parentMavenProject</artifactId> <version>0.0.1-SNAPSHOT</version> <name>parentMavenProject</name> <description>parentMavenProject</description> <packaging>pom</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.3.1</version> </dependency> </dependencies> </project>

8.5、创建子项目

所谓的子项目,其实是maven module.

右键点击 parentMavenProject->New->Module.

0

接下来的步骤跟上面的步骤一样

TestHutool

在 childMavenProject 下新建 TestHutool类,并运行。

可以发现,是可以使用 hutool jar 里的类的。 这说明子项目,能够使用 父项目中的 jar 包了。

public class TestHutool {     public static void main(String[] args) {         String dateStr = "2012-12-12 12:12:12";         Date date = DateUtil.parse(dateStr);         System.out.println(date);     } }

0

8.6、子项目的pom.xml

观察子项目的 pom.xml ,可以发现它多了个 parent, 这个就是对父项目的依赖。

<parent> <artifactId>parentMavenProject</artifactId> <groupId>cn.how2j</groupId> <version>0.0.1-SNAPSHOT</version> </parent>

0

8.7、父项目的pom.xml

此时再打开父项目的 pom.xml ,可以发现它多了这么一个模块s, 就表示对子项目的关联。

<modules> <module>childMavenProject</module> </modules>

0

8.8、项目结构

观察目录结构,可以发现 childMavenProject 是位于 parentMavenProject下面的。 所以如果将来有 childMavenProject1, childMavenProject2, childMavenProject3 也会放在这么一个目录下,就方便管理了。

0

9、maven搭建ssm项目案例

<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>maven-demo-test</artifactId> <version>1.0-SNAPSHOT</version> <name>maven-demo-test</name> <packaging>war</packaging> <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <junit.version>5.7.1</junit.version> <spring.version>5.2.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!--Spring核心基础依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <!-- 增加了切面 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!--spring mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!--mybatis相关--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- 与spring整合 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- 连接池 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.7</version> </dependency> <!--jstl, 标签库--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!--日志相关--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <!--测试相关--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--通过注解生成get和set方法--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!-- json解析的依赖 在我们接口返回实体类的时候,需要用到 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.3</version> </dependency> <!--alibaba提供的json工具,将对象和JSONObject相互转换--> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> </dependencies> <build> <!-- 把src/main/java目录下所有的xml文件都包含进去,其中${basedir} 是MAVEN的内置变量,表示项目根目录。 同样,想包含其他什么文件,比如.properties文件,再加一个<include>标签类似的写法即可。 --> <finalName>mapperFile</finalName> <resources> <resource> <directory>${basedir}/src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.0</version> </plugin> </plugins> </build> </project>

0

①、项目需要的配置文件

②、静态资源文件

③、jsp页面的位置

ssm 整合不导包 Cannot resolve org.springframework:spring-jcl:5.0.10.RELEASE解决方法_mohan_zhao的博客-CSDN博客

解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件

解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件_Beauxie的博客-CSDN博客_target里没有mapper

闭坑

关于验证拦截的设置

这个是证书出现问题,只要在idea的这个位置加上:

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

解决Could not transfer metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml fro_全干工程师呀的博客-CSDN博客

maven插件设置编译环境

使用maven-compiler-plugin插件,在pom文件设置默认的jdk编译版本(以JDK1.8为例)_gao_jun1的博客-CSDN博客

Maven下载jar包出现.lastUpdated结尾的文件

出现.lastUpdated文件原因:由于网络原因没有将Maven的依赖下载完整导致。

解决方案:

删除所有以 .lastUpdate 结尾的文件。

a) 进入到自己 maven 的本地仓库

b) 在当前本地仓库目录打开 cmd 命令行

c) Windows执行命令:

for /r %i in (*.lastUpdated) do del %i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值