目录
Maven入门链接:https://blog.csdn.net/weixin_38568503/article/details/121023607.
Maven常用技巧:
(1)当前maven项目的依赖刷新载入:
(2)所有maven项目的依赖刷新载入:
(3)标记文件夹的两种方式:
或者:File–>Project Structure
Maven工程关系:依赖
有三种关系:依赖,继承,聚合
Maven依赖总结:maven工程的依赖是通过dependency中的gav坐标来实现的,前提是将父工程或者其他官方的jar安装到本地仓库才行。
【3】依赖的好处:
省去了程序员手动添加jar包测操作,省事!!
还可以帮我们解决jar包冲突的问题:
①依赖传递性:
案例演示依赖的传递性:
(1)创建maven项目MavenDemo并导入依赖mybatis3.5.6,如图:
(2)然后将项目MavenDemo重新打包为jar并安装到本地仓库(使用idea右侧的maven命令install):
(3)然后我们再单独创建一个maven项目MavenDemo2,让项目MavenDemo2依赖项目MavenDemo:(这里使用依赖的gav)
从上面可以证明:项目2依赖项目1,项目一依赖mybatis工程,–>传递性–>项目二可以直接使用mybatis工程。
.依赖传递的两个原则:
②.排除依赖:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--MavenDemo2项目的gav-->
<groupId>org.example</groupId>
<artifactId>MavenDemo2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<!--MavenDemo项目的gav复制过来即可形成依赖关系-->
<groupId>org.example</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖,排除项目一中的mybatis-->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
③.依赖范围:
1.scope:
scope是设置依赖范围的。
provided:提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。
maven常用的scope有compile,provided,runtime,test:
1、complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。
2、test表示只在test阶段有依赖关系,例如junit。
3、provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供。
4、runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池。
2.scope provided:
provided:提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。
举例说明:现有一普通Web工程,必然会用到servlet-api这个包。但是实际上这个包一定是由容器提供的,因为我们这个web会部署到容器内,容器会提供servlet-api,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。
④.统一管理依赖的版本:
properties标签:使用properties标签内使用自定义标签统一声明版本号,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级(配置属性)。
(1)使用properties标签内使用自定义标签统一声明版本号:
<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
</properties>
(2)在需要统一版本的位置,使用${自定义标签名}引用声明的版本号:
<version>${cvzhanshi.spring.versio}</version>
properties其他用途:
其实properties标签配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号。凡是需要统一声明后再弓|用的场合都可以使用:
<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
依赖管理器dependencyManagement:用于声明依赖的坐标gav,不实际引入jar:
⑤.Maven 中optional-true-optional和scope-provided-scope之间的区别:
依赖管理是maven提供的主要功能之一。无论我们需要什么依赖,我们只需将它们添加到POM.xml中。由于maven,所有必要的类和资源都会自动添加到项目的classpath中。
在添加依赖项时,我们可以使用optional标志,或将scope设置为“provided”。在这两种情况下,依赖关系都将在声明它们的模块的classpath中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。
从语义来上理解
- optional:
可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。
- scope provided:
提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。
举个例子说明二者的使用场景和区别:
- optional:
现开发了一个类似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多种数据库方言的支持:mysql/oracle/db2/postgresql…
每种数据库支持也独立了一个module,Summer的依赖中配置了每种数据库的支持包:summer-mysql-support/summer-oracle-support…
但是实际引用此框架/依赖时,并不需要所有数据库方言的支持。此时可以把数据库的支持包都配置为可选的true。
引用此框架时,只需按需引入自己需要的方言支持包即可,避免了冗余繁杂的依赖,也降低了jar包冲突的风险。
- scope provided:
现有一普通Web工程,必然会用到servlet-api这个包。但是实际上这个包一定是由容器提供的,因为我们这个web会部署到容器内,容器会提供servlet-api,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。
maven常用的scope有compile,provided,runtime,test:
1、complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。
2、test表示只在test阶段有依赖关系,例如junit。
3、provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供。
4、runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池。
总结:
二者从功能来看,都做到了依赖不传递。但在语义上表示不同,使用时按场景选择就好。
Maven工程关系:继承
类似于java中类的继承。
在java中如果父类定义了一个属性如String name=“张三”;
则子类继承了这个父类,则子类是不是直接可以使用name=“张三”.
同理,当我们在父工程中定义了一个依赖的版本号,则子工程也可以直接使用父工程的版本号。
Maven继承的总结:通过在子工程中使用parent标签,来指明自己的父工程gav是谁以及父工程的pom相对位置。
①.parent标签:在Maven中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似Java的继承机制,用parent声明要继承的父工程的pom配置(继承)。
②.relativePath标签:
父项目的pom.xml文件的相对路径。默认值为…/pom.xml。maven首先从当前构建项目开始查找父项目的pom文件,然后从本地仓库找,然后从远程仓库找。RelativePath允许你选择一个不同的位置。
如果默认…/pom.xml没找到父元素的pom,不配置relativePath指向父项目的pom则会报错。
maven继承案例演示:
注意maven继承,不需要install父工程到本地仓库的。
(1)首先创建一个父工程MavenDemo(File–>New Project),打包方式为pom:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--packaging标签定义成pom工程,
pom工程是一个逻辑工程,没有任何的包的实际引入,只做包的版本声明-->
<packaging>pom</packaging>
<!--声明变量,一般用于版本号的声明-->
<properties>
<mybatis.version>3.5.6</mybatis.version>
</properties>
<!--依赖管理器:用于声明依赖的坐标gav,不实际引入jar-->
<dependencyManagement>
<dependencies>
<dependency>
<!--依赖的坐标-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
<!--依赖的范围:import只能用于dependencyManagement
中的scope中,表明指定的pom必须导入我规定的版本号-->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
(2)创建一个子工程MavenDemo2:(File–>New Project)
子工程使用parent标签来指明自己继承的父类maven工程是谁,
parent标签中写父maven工程的gav坐标,和父pom的位置:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--parent声明当前项目的父工程的gav是谁-->
<parent>
<groupId>org.example</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父项目的pom.xml文件的相对路径-->
<relativePath>../MavenDemo/pom.xml</relativePath>
</parent>
<!--当前本项目的gav-->
<groupId>org.example</groupId>
<artifactId>MavenDemo2</artifactId>
<version>1.0-SNAPSHOT</version>
<!--子工程实际引入的依赖,会下载jar包-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
</project>
图示说明继承关系:
Maven工程关系:聚合
聚合其实也包含了继承的关系。
Maven聚合的总结:通过在一个父工程的底下创建子模块来形成聚合,表现为父工程自动通过标签modules和module自动聚合子工程的模块名.
Maven工程聚合案例:
(1)创建总工程:pom工程
(2)创建子模块:(在总工程下创建子模块)
(3)发现总工程中通过标签modules和module自动聚合(集合的意思)了所有的子模块,如下所示:
编译器插件:
<build>
<plugins>
<!--jdk编译插件-->
<plugin>
<!--jdk编译插件的坐标-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!--源代码编译成class文件的版本-->
<target>1.8</target>
<!--源码使用的jdk版本-->
<source>1.8</source>
<!--项目构建使用的编码,避免中文乱码-->
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
查看jdk版本:
资源拷贝插件:
<build>
<resources>
<resource>
<!--所在的目录-->
<directory>src/main/java</directory>
<includes>
<!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.txt</include>
</includes>
<!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
tomcat插件:
<build>
<plugins>
<!--配置tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--配置tomcat监听端口-->
<port>8080</port>
<!--配置项目的访问路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
执行命令: