Maven笔记
【1】Maven配置
<?xml version="1.0" encoding="UTF-8"?>
< settings xmlns = " http://maven.apache.org/SETTINGS/1.2.0"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation= " http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd" >
< localRepository> D:\\repos</ localRepository>
< pluginGroups>
</ pluginGroups>
< proxies>
</ proxies>
< servers>
</ servers>
< mirrors>
< mirror>
< id> alimaven</ id>
< name> aliyun maven</ name>
< url> http://maven.aliyun.com/nexus/content/groups/public/</ url>
< mirrorOf> *</ mirrorOf>
</ mirror>
</ mirrors>
< profiles>
< profile>
< id> jdk-11</ id>
< activation>
< activeByDefault> true</ activeByDefault>
< jdk> 11</ jdk>
</ activation>
< properties>
< maven.compiler.source> 11</ maven.compiler.source>
< maven.compiler.target> 11</ maven.compiler.target>
< maven.compiler.compilerVersion> 11</ maven.compiler.compilerVersion>
</ properties>
</ profile>
</ profiles>
< activeProfiles>
< activeProfile> jdk-11</ activeProfile>
</ activeProfiles>
</ settings>
【2】pom.xml
<?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> com.bjsxt</ groupId>
< artifactId> my-maven</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ project>
【3】资源拷贝
<?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> com.bjsxt</ groupId>
< artifactId> idea_mvn</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< dependencies>
< dependency>
< groupId> junit</ groupId>
< artifactId> junit</ artifactId>
< version> 4.13.2</ version>
</ dependency>
</ dependencies>
< build>
< resources>
< resource>
< directory> src/main/java</ directory>
< includes>
< include> **/*.txt</ include>
< include> **/*.properties</ include>
< include> **/*.xml</ include>
</ includes>
< filtering> true</ filtering>
</ resource>
< resource>
< directory> src/main/resources</ directory>
< filtering> true</ filtering>
</ resource>
</ resources>
</ build>
</ project>
【4】发布项目到Tomcat中
1. 设置项目类型为war。如果没有修改成war,运行时控制台会显示BUILD SUCCESS。而不是正常web项目启动日志。
2. 在pom.xml的<build>中添加Tomcat7插件
3. 点击IDEA右侧Maven面板,选择要运行的项目 -> Plugins -> tomcat7 -> tomcat7:run
<?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> com.bjsxt</ groupId>
< artifactId> mavenweb1</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< packaging> war</ packaging>
< build>
< plugins>
< plugin>
< groupId> org.apache.tomcat.maven</ groupId>
< artifactId> tomcat7-maven-plugin</ artifactId>
< version> 2.2</ version>
< configuration>
< path> /bjsxt</ path>
< port> 8081</ port>
</ configuration>
</ plugin>
</ plugins>
</ build>
</ project>
【5】POM模型-依赖关系
[1] 实现核心
父工程配置完成后通过Maven面板中的install将工程打包后安装到本地。注意:install后如果对工程进行了修改,需要重新install。
[2] 依赖中央仓库中的资源:
只要在pom文件中,依赖对应资源的坐标即可。
先找本地仓库中的资源,如果没有,链接中央仓库,下载到本地仓库,再导入到当前工程中。
[3] 依赖自定义的工程:
在pom文件中,增加自定义工程的坐标即可。
先找本地仓库中的资源,如果没有,链接中央仓库,下载到本地仓库,再导入到当前工程中。
自定义的工程,必须先安装到本地仓库,或申请统一个中央仓库资源坐标上传到中央仓库后,才可以依赖。
使用maven的生命周期管理中的install即可。
[4] 依赖的交叉|传递|冲突等问题:
依赖的传递: 工程A,依赖工程B,那么B工程依赖的所有资源,A工程自动依赖
依赖的冲突: 工程A,依赖工程B和C,B依赖了mysql驱动8.0.29,C依赖了
mysql驱动8.0.28。A中依赖的mysql驱动,根据pom文件中的配置顺序,
由上至下,优先依赖。不是依赖最高版本。
依赖的路径: 工程A,依赖工程B和C,C依赖工程D。B依赖mysql8.0.29,D依赖
mysql8.0.28,那么A中的mysql一定是8.0.29。因为maven中的多个冲突依赖
使用最短路径优先。
依赖的交叉: 工程A,依赖工程B和C,B和C都依赖对方。A中的依赖是B和C。
<?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> com.bjsxt</ groupId>
< artifactId> projecta</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< dependencies>
< dependency>
< groupId> com.bjsxt</ groupId>
< artifactId> projectb</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ dependency>
</ dependencies>
</ project>
<?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> com.bjsxt</ groupId>
< artifactId> projectb</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< dependencies>
< dependency>
< groupId> com.bjsxt</ groupId>
< artifactId> projectc</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ dependency>
</ dependencies>
</ project>
【6】POM模型-继承关系
[1] 实现核心:
1. 父工程配置完成后通过Maven面板中install把工程安装到本地仓库
2. 在子工程中使用`<parent>`标签表示指定当前工程的父工程。里面配置父工程的坐标
3. 子工程只继承了父工程的pom.xml。并不会继承src/main下的内容
4. 如果想要使用另一个工程的类,这种关系在Maven中叫做依赖
[2] 继承的是父工程的pom。继承父工程的依赖。
[3] 要求父工程的工程类型必须是pom。配置完成后通过Maven面板中install把工程安装到本地仓库。
[4] pom类型的工程,实际上是没有java代码的。
[5] maven工程中,依赖分为管理和依赖。
管理:类似Java中的import,只是导入了,但是未必使用。
用于在父工程中,定义子工程需要依赖的各种资源的版本和名称和组。
子工程是不会自动依赖的。
在子工程中依赖父工程定义的管理内容,可以省略版本。
默认使用父工程中管理的资源版本。
如果子工程也定义了依赖的资源版本,最短路径优先。
依赖:类似Java中定义一个变量,即导入了,也使用了
<?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> com.bjsxt</ groupId>
< artifactId> projectparent</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< properties>
< mysql-version> 8.0.27</ mysql-version>
</ properties>
< dependencyManagement>
< dependencies>
< dependency>
< groupId> mysql</ groupId>
< artifactId> mysql-connector-java</ artifactId>
< version> ${mysql-version}</ version>
</ dependency>
</ dependencies>
</ dependencyManagement>
</ project>
<?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>
< groupId> com.bjsxt</ groupId>
< artifactId> projectparent</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ parent>
< groupId> com.bjsxt</ groupId>
< artifactId> projectchild</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< dependencies>
< dependency>
< groupId> mysql</ groupId>
< artifactId> mysql-connector-java</ artifactId>
</ dependency>
</ dependencies>
</ project>
【7】POM模型-聚合关系
[1] 实现核心
1. 父工程,一定是pom类型的
2. 聚合项目中父工程专属配置,表示当前项目的子项目
[2]聚合子工程
默认继承父工程的groupId和version。
聚合子工程,和普通子工程的特性完全相同,也就是继承父工程的依赖,可使用父工程的依赖管理资源版本。
聚合子工程,是父工程的一个组成部分,称为module。模型。会在父工程的pom.xml配置文件中体现。使用<module>标签描述。
聚合关系可以是多个层次。如:父工程A,有聚合子工程B,B有聚合子工程C。那么A和B都是pom类型的工程,C可以是jar或war类型的。
聚合工程关系树中,只在叶子节点的工程中编写代码。非叶子节点的工程,都是pom类型的,都不编写代码。
[3] 继承 和 聚会 区别
聚合关系中的父子继承,还有依赖,都和普通的继承依赖特性相同。
普通的继承: 父工程的依赖,子工程自动依赖。 父工程的依赖管理,子工程可以使用。
聚合关系的继承下: 父工程的依赖,子工程自动依赖。 父工程的依赖管理,子工程可以使用。
普通的依赖: 最短路径传递依赖。
聚合关系的依赖: 最短路径传递依赖。 最好不要依赖聚合关系中的直接父工程。很少依赖间接的聚合父工程。
聚合关系中,可以不安装,直接实现继承和依赖。原因是,聚合父子工程,都在当前开发窗口中。属于同一个局部。
这种情况下,优先找聚合范围内的资源,没有再找本地仓库,没有访问中央仓库,再没有,抛出异常。
注意:如何真的需要安装,那么必须先安装顶级父工程,再安装,子工程。依次递归。
因为安装聚合工程,必须从根到叶子,依次安装。所以,maven的安装逻辑,会自动安装当前的工程和包含的聚合子孙工程。
安装聚合顶级父工程的直接子工程,且这个子工程没有依赖,没有代码,可以安装成功,因为无资源,无代码,无编译,无运行。
但是,依赖这个安装的工程时,很可能发生错误。
如果,需要使用,聚合父工程中定义的依赖管理时,可能无法找到父工程的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> com.bjsxt</ groupId>
< artifactId> all_pro</ artifactId>
< packaging> pom</ packaging>
< version> 1.0-SNAPSHOT</ version>
< modules>
< module> sub1_pro</ module>
< module> sub2_pro</ module>
</ modules>
< properties>
< junit-version> 4.13.2</ junit-version>
< mysql-version> 8.0.29</ mysql-version>
</ properties>
< dependencyManagement>
< dependencies>
< dependency>
< groupId> mysql</ groupId>
< artifactId> mysql-connector-java</ artifactId>
< version> ${mysql-version}</ version>
</ dependency>
< dependency>
< groupId> junit</ groupId>
< artifactId> junit</ artifactId>
< version> ${junit-version}</ version>
< scope> test</ scope>
</ dependency>
</ dependencies>
</ dependencyManagement>
< dependencies>
< dependency>
< groupId> javax.servlet</ groupId>
< artifactId> javax.servlet-api</ artifactId>
< version> 4.0.1</ version>
< scope> provided</ scope>
</ dependency>
</ dependencies>
</ project>
<?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" >
< parent>
< artifactId> all_pro</ artifactId>
< groupId> com.bjsxt</ groupId>
< version> 1.0-SNAPSHOT</ version>
</ parent>
< modelVersion> 4.0.0</ modelVersion>
< artifactId> sub1_pro</ artifactId>
< dependencies>
</ dependencies>
</ project>
<?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> com.bjsxt</ groupId>
< artifactId> pro_1</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< dependencyManagement>
< dependencies>
< dependency>
< groupId> com.bjsxt</ groupId>
< artifactId> all_pro</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< scope> import</ scope>
< type> pom</ type>
</ dependency>
</ dependencies>
</ dependencyManagement>
< dependencies>
< dependency>
< groupId> com.bjsxt</ groupId>
< artifactId> pro_2</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ dependency>
< dependency>
< groupId> com.bjsxt</ groupId>
< artifactId> pro_3</ artifactId>
< version> 1.0-SNAPSHOT</ version>
</ dependency>
< dependency>
< artifactId> sub1_pro</ artifactId>
< groupId> com.bjsxt</ groupId>
< version> 1.0-SNAPSHOT</ version>
</ dependency>
< dependency>
< groupId> junit</ groupId>
< artifactId> junit</ artifactId>
</ dependency>
</ dependencies>
</ project>
【8】部署Maven项目到服务器
1. 保证项目的`<packaging>`为war类型
2. 配置tomcat的tomcat-users.xml
3. 配置工程的pom.xml
4. 点击Maven面板的package进行打包
5. 点击Maven面板的Plugins选择tomcat:deploy即可进行远程部署,如果服务器中已经存在这个项目,再次运行会报错。再次部署点击 tomcat7:redeploy进行第一次或第N次部署
< tomcat-users xmlns = " http://tomcat.apache.org/xml"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation= " http://tomcat.apache.org/xml tomcat-users.xsd"
version = " 1.0" >
< role rolename = " manager-gui" />
< role rolename = " manager-script" />
< role rolename = " manager-jmx" />
< role rolename = " manager-status" />
< role rolename = " admin-gui" />
< role rolename = " admin-script" />
< user username = " admin" password = " admin" roles = " manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</ tomcat-users>
< build>
< plugins>
< plugin>
< groupId> org.apache.tomcat.maven</ groupId>
< artifactId> tomcat7-maven-plugin</ artifactId>
< version> 2.2</ version>
< configuration>
< url> http://192.168.8.129:8080/manager/text</ url>
< username> admin</ username>
< password> admin</ password>
< path> /project</ path>
</ configuration>
</ plugin>
</ plugins>
</ build>
【9】常见命令
常用指令 指令含义 mvn help:system 打印系统属性和环境变量 mvn clean 删除target目录,清理所有之前所有编译的内容。手动删除target目录和运行此命令是等效的。 mvn validate 验证项目是否可用 mvn compile 编译项目,生成target目录 mvn test 执行测试。执行测试时会自动运行src/test/java 目录下所有**/Test.java、**/Test .java、**/*TestCase.java 文件,采用约定方式执行。 mvn package 打包项目 mvn deploy 发布项目 mvn verify 校验包是否正确 mvn install 安装到本地仓库 mvn site 生成站点。但是需要添加插件才能使用。
< build>
< plugins>
< plugin>
< groupId> org.apache.maven.plugins</ groupId>
< artifactId> maven-project-info-reports-plugin</ artifactId>
< version> 2.7</ version>
</ plugin>
</ plugins>
</ build>
【10】生命周期
[1] Maven有三套相互独立的生命周期(Lifecycle ):
- Clean Lifecycle:做一些清理工作;
- Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;
- Site Lifecycle:生成项目报告、站点、发布站点;
[2] Default Lifecycle包含如下阶段:
- `validate` - 验证项目是否正确并且所有必要的信息都可用
- `compile` - 编译项目的源代码
- `test`- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码
- `package` - 将编译后的代码打包成可分发的格式,例如 JAR。
- `verify` - 对集成测试的结果进行任何检查,以确保满足质量标准
- `install` - 将包安装到本地存储库中,作为本地其他项目的依赖项
- `deploy` - 在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享
【11】scope(面试题)
取值 解释 compile 默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。 provided 只是编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。 runtime 运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。mysql驱动 test 只在测试时生效,这个包中的类只能在src/test中使用。常用在junit依赖时需要被配置。 system 类似provided,但是需要结合systemPath属性,表示依赖不是来源于本地库,而是来源于其他目录。使用较少,在一些特殊项目中才可能被使用。 import 只能在dependencyManagement标签中使用的域,代表这个资源只是导入的资源,不是依赖的资源。只使用这个资源中的依赖管理内容。常用在依赖pom类型项目。如:微服务,云开发等。