哔哩哔哩尚硅谷 Maven-Eclipse版 学习视频网址
文章只为分享学习经验和自己复习用,学习还是去查看正规视频网站和官方文档更有效
解释 | 归属 | 备注 | |
---|---|---|---|
pom.xml | Maven核心配置文件 | 文件 | |
resources | 资源,存放框架或其他工具 | 文件 | |
|
项目组ID | pom.mxl | 官网倒序 |
|
项目的模块ID | pom.mxl | |
|
模块版本号 | pom.mxl | |
|
依赖信息 | pom.mxl | |
|
依赖类型 | pom.mxl | |
|
依赖范围 | pom.mxl | |
mvn clean | 清理 | Maven命令 | |
mvn compile | 编译主程序 | Maven命令 | |
mvn test-compile | 编译测试程序 | Maven命令 | |
mvn test | 执行测试 | Maven命令 | |
mvn package | 打包 | Maven命令 | 执行下面,上面的也会执行 |
mvn install | 安装 | Maven命令 | 安装才会存入本地仓库 |
mvn site | 生产站点 | Maven命令 | |
compile | 编译 | 依赖范围 | 全能使用,并且保存 |
test | 测试 | 依赖范围 | 只测试使用,不保存 |
provided | 假如 | 依赖范围 | 全能使用,但是不保存 |
Clean | 清理 | 依赖生命周期 | |
Site | 位置 | 依赖生命周期 | |
Default | 默认 | 依赖生命周期 | |
|
依赖排除 | pom.mxl | |
|
性质 | pom.mxl | 统一版本号 |
|
继承 | 继承pom.mxl | 子类声明 |
|
相对路径 | 继承pom.mxl | 子类中的父类路径 |
|
依赖关系管理 | 继承pom.mxl | 父类统一配置子类依赖 |
|
聚合 | pom.mxl | 一键安装各个模块 |
|
部署 | pom.mxl | 已经不太适用 |
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
Make → Ant → Maven → Gradle
构建并不是创建,创建一个工程并不等于构建一个项目。
要了解构建的含义我们应该由浅入深的从以下三个层面来看:
1、纯 Java 代码
大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
2、Web 工程
当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务
器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。
3、实际项目
在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。
概念:以 “Java源文件”、“框架配置文件”、”JSP“、”HTML“、”图片“ 等资源为 ”原材料“,去 ”生产“ 一个可以运行的项目的过程
编译:Java源文件[User.java] → 编译 → Class字节码文件[User.class] → 交给JVM去执行
Tips:运行时环境
其实是一组jar包的引用,并没有把jar包本身复制到工程中,所以并不是目录
“ 编译的结果 ”
生的鸡 → 处理 → 熟的鸡
动态Web工程 → 编译、部署 → 编译结果
相对路径在没有输入/WebContent
时也能正确跳转,是由于程序真正运行的是编译结果。
根目录名为工程名字,里面没有WebContent目录,WebContent目录的内容已经变成了编译结果的主体内容,包括/good
。
所以开发过程中,所有的路径或配置文件中配置的类路径等都是以编译结果的目录结构为标准的
Tips:tc_sever 可以查看项目目录
整个目录复制到eclipse解压安装目录下的dropins目录下即可
实际使用中IDEA和Eclipse已经帮助我们进行了构建与部署,所有体验不是很明显
由于它环节比较多,如果只是人工去操作就比较费劲,所以自动化构建尤其重要
一个正常的修复BUG流程
如果将重复的步骤交给自动构建就可以省很多步骤
C:\Users\Administrator>echo %JAVA_HOME%
G:\java\jdk
解压Maven核心程序的压缩包,放在一个非中文无空格路径下
D:\Environment\apache-maven-3.8.1
C:\Users\Administrator>mvn -v Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: D:\Environment\apache-maven-3.8.1\bin\.. Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: G:\java\jdk\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml
Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动化编译,那么它必须知道Java源文件保存在哪里
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classspath:spring-context.xmlparam-value>
context-param>
遵守框架内部已经存在的约定
log4j.properties
log4j.xml
约定 > 配置 > 编码
创建约定目录
按约定创建
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml
POM.xml文件内容
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>Helloname>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.0version>
<scope>testscope>
dependency>
dependencies>
project>
编写主程序diam
编写主程序代码
在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
编写测试代码
在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
//assertEquals 断言,断言results 和内容一样,不然抛异常
}
}
(1)注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。与构建过程相关:编译、测试、打包、…
(2)常用命令
mvn clean:清理
mvn compile:编译主程序
生成target文件→classes和maven-status文件
mvn test-compile:编译测试程序
mvn test:执行测试
mvn package:打包(只会打包主程序)
target文件中出现→maven-archiver、surefire-reports(测试报告)、test-classes、Hello-0.0.1-SNAPSHOT.jar(只有主程序,没有测试程序)
mvn install:安装
mvn site:生成站点
执行各个构建环节都是有顺序的,当你执行 “打包” 的时候,也会执行 “测试”
1、Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven得核心程序中
2、当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找
3、本地仓库的默认位置:[系统中当前用户的家目录]\.m2\repository
C:\Users\[登录当前系统的用户名]\.m2\repository
4、Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载
5、如果此时无法连接外网,则构建失败
6、修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
/path/to/local/repo
从注释中取出含义:Project Object Model 项目对象模型
pom.xml 对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
重要程度相当于web.xml对于动态Web工程
1、数学中的坐标
(1)在一个平面中使用 x、y 两个向量可以唯一的确定平面中的一个点。
(2)在空间中使用 x、y、z 三个向量可以唯一的确定空间中的一个点。
2、Maven 的坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
GAV
(1)groupid:公司或组织的域名倒序+当前项目名称
<groupid>com.ssxxz.mavengroupid>
(2)artifactId:当前项目的模块名称
<artifactId>HelloartifactId>
(3)version:当前模块的版本
<version>1.0.0version>
SNAPSHOT
表示一个不稳定的更新速度很快,临时的一个
RELEASE
分离,表示这个工程已经彻底分离了,一个完整稳定的版本
3、Maven工程的坐标与仓库中路径的对应关系
Maven工程
<modelVersion>4.0.0modelVersion>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.0.0.RELEASEversion>
仓库中路径
org\springframework\spring-core\4.0.0.RELEASE\spring-core-4.0.0.RELEASE.jar
1、仓库的分类
仓库的分类
本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
远程仓库:
私服(局域网):架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务
中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务
中央仓库镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求
1、工程名:HelloFriend
2、目录结构与第一个Maven工程相同
3、POM文件
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloFriendartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>HelloFriendname>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.0version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloartifactId>
<version>0.0.1-SNAPSHOTversion>
<scope>compilescope>
dependency>
dependencies>
project>
注意:已经依赖了 Hello,是否可以使用?
4、主程序:在src/main/java/com/atguigu/maven目录下新建文件HelloFriend.java
它调用了 Hello() 方法
package com.atguigu.maven;
import com.atguigu.maven.Hello;
public class HelloFriend {
public String sayHelloToFriend(String name){
Hello hello = new Hello();
String str = hello.sayHello(name)+" I am "+this.getMyName();
System.out.println(str);
return str;
}
public String getMyName(){
return "John";
}
}
5、测试程序:在/src/test/java/com/atguigu/maven目录下新建测试文件HelloFriendTest.java
package com.atguigu.maven;
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
import com.atguigu.maven.Hello;
public class HelloFriendTest {
@Test
public void testHelloFriend(){
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHelloToFriend("litingwei");
assertEquals("Hello litingwei! I am John",results);
}
}
6、运行Maven命令
最后结果Hello工程无法被解析,找不到!
(是由于本地仓库com.atguigu.maven里没有Hello工程,所以找不到)
Maven解析依赖信息时会到本地仓库中查找依赖的jar包,没有找到Hello所以会报错。
对于我们自己开发的Maven工程里面缺失很多必要文件,所以需要使用 mvn install命令安装后才可以进入仓库。
compile, test, provided
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Jp7AuUy-1631410147706)(Maven.assets/image-20210903211206806.png)]
主程序看不到测试程序,但是测试程序可以看到主程序
provided部署运行的时候就会被忽略
强行部署会产生冲突
各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
Maven核心程序为了更好的实现自动化构建,按照这一的特点执行生命周期中的各个阶段:无论现在要执行生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。
插件和目标
生命周期的各个阶段仅仅定义了要执行的任务是什么?
各个阶段和插件的目标是对应的。
相似的目标由特定的插件来完成。
生命周期阶段 | 插件目标 | 插件 |
---|---|---|
compile | compile | maven-compile-plugin |
test-compile | testcompile | maven-compile-plugin |
可以将目标看作 ”调用插件功能的命令“
Maven 有三套相互独立的生命周期,分别是:
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。
比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
Clean 生命周期一共包含了三个阶段:
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources:复制并处理资源文件,至目标目录,准备打包。
compile:编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources:复制并处理资源文件,至目标测试目录。
test-compile:编译测试源代码。
process-test-classes
test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package:接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install:将包安装至本地仓库,以让其它项目依赖。
deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
user settings
注意:默认 JDK1.5
JDK1.5 和 1.8 编程时常见差别
List<String> list = new Array<> //1.8后一个泛型可以省略
List<String> list = new Array<String> //1.5必须类型必须写出来,不然无法识别
//会报 diamond 错误
手动修改JDK
右键
设置通过Maven创建的工程的JDK版本——一劳永逸
<profile>
<id>jdk-1.8id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>1.8jdk>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
不使用简单模式创建
如果不使用简单模式创建,就会让你选择各种插件,同时创建后的目录也不相同
(可能我配置有缺陷,我打开没有任何插件)
但是生成出的web和实际web工程差距很大
META-INF 和 WEB-INF 都没有
解决方案
Properties
先把√去掉
再√上会出现 Further 点击进入
修改内容,并保证 Generate… √的存在
META-INF 和 WEB-INF 就出现了
同时可能出现的6.2、6.3、6.4错误
但是创建 jsp 后却报错,缺失 HttpServlet
(1)在pom.xml 中添加
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>WebProjectartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
dependencies>
project>
同时可能出现的(6.1)缺少Maven Dependencies错误
(2)https://blog.csdn.net/fjjfqwzcq/article/details/114372225 添加Jar包
(3)https://www.cnblogs.com/achengmu/p/8082457.html 添加库
同一个报错的三种方法
同时发现,只有compile范围的才会部署到WEB-INF→lib目录下,
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
没写范围就默认 compile 范围
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.14version>
dependency>
其他都没有部署
EL表达式自动提示
需要JSPAPI依赖
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1.3-b06version>
<scope>providedscope>
dependency>
(但是我依赖后有自动提示,但是点击后没有反应,并且光标会跳到最后一行,无法自动补全。)
jar也进来了
pom.xml 右键 Run As 里选择命令
Maven build… 里可以添加命令
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1.3-b06version>
<scope>providedscope>
dependency>
当jsp-api范围为
时,会报空指针异常。
是因为当范围为compile时,它的 jar包就会被部署在工程 lib目录中。
但是Tomcat lib目录中内也有同样的 jar包,这样就会发生冲突。
正常情况下的导入使用Import→Existing…
但是在eclipse读取中不认为我们自己创建的maven是eclipse工程,因为它没有这三个,所以无法导入
一般我们使用Maven导入
选择后它会自动扫描,是依据pom.xml来识别的。
导入后,这三个文件就自动加入了
MakeFriends
package com.atguigu.maven;
public class MakeFriends {
public String makeFriends(String name){
HelloFriend friend = new HelloFriend();
friend.sayHelloToFriend("litingwei");
String str = "Hey,"+friend.getMyName()+" make a friend please.";
System.out.println(str);
return str;
}
}
MakeFriendsTest
package com.atguigu.maven;
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
public class MakeFriendsTest {
@Test
public void testMakeFriends() {
MakeFriends makeFriend = new MakeFriends();
String str = makeFriend.makeFriends("litingwei");
assertEquals("Hey,John make a friend please.", str);
}
}
导入包可以使用eclipse导入,也可以使用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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>MakeFriendsartifactId>
<version>0.0.1-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloFriendartifactId>
<version>0.0.1-SNAPSHOTversion>
<type>jartype>
<scope>compilescope>
dependency>
dependencies>
project>
JRE 是Eclips自带的运行时环境
Maven Dependencies就是Maven依赖的运行时环境
运行时环境不是本地仓库jar,而是jar的引用,还在它原来自定义的位置
Eclipse 和 Maven 工程识别
虽然运行环境中有HelloFriend,但是实际仓库中并没有 , HelloFriend并没有安装
但是java方法中可以调用,Maven命令时,却没法解析
这是因为eclipse里自带插件的寻找功能,可能在系统工作台找到,和maven没关系
所以当执行Maven命令时,却会因为找不到而报错
Maven主要工程前期搭建环境的时候比较复杂,但是一旦环境搭建好,后期编程的时候就一般感觉不到Maven的存在
在在Hello/pam.xml中添加对spring-core的依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.0.0.RELEASEversion>
<scope>compilescope>
dependency>
Hello环境里出现了spring-core的jar包和它关联的commons-logging包
同时:
HelloFriend环境里也出现了spring-core的jar包
MakeFriends也有了
这就是依赖的传递性!!
传递过来的,间接依赖
好处:可以传递的依赖不必在每个模块工程中都重复声明,在 “最下面” 的工程依赖一次即可。
非compile范围的依赖不能传递
test 和 provided 范围不能传递,所以在各个工程模块中,如果有需要就得重复声明依赖
需要设置依赖排除的场合
假如不希望将commons-logging包传递过来
依赖排除的设置方式
找到需要排除的ID
在继承的依赖方法中,加入排除公式
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>MakeFriendsartifactId>
<version>0.0.1-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloFriendartifactId>
<version>0.0.1-SNAPSHOTversion>
<type>jartype>
<scope>compilescope>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
dependencies>
project>
同时它的下面的工程也传递不到该jar包
1、作用:解决模块工程之间的jar包冲突问题
2、验证路径最短者优先原则
举例1
这里对Spring各个jar包的依赖版本都是4.0.0
如果需要统一升级为4.1.1,怎么办?手动逐一修改不可靠
建议配置方法
使用properties标签内使用自定义标签统一声明版本号
<properties>
<atgugigu.spring.version>4.0.0.RELLEASEatgugigu.spring.version>
properties>
在需要统一版本的位置,使用**${自定义标签名}**引用声明的版本号
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-wedartifactId>
<version>${atgugigu.spring.version}version>
dependency>
这样只需要修改properties标签内版本号就可以
其实properties标签配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号。
凡是需要统一声明后再引用的场合都可以使用
<properties>
<atgugigu.spring.version>4.0.0.RELLEASEatgugigu.spring.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<aa.bb.cc>wwwaa.bb.cc>
properties>
1、现状
Hello依赖的junit:4.0
HelloFriend依赖的junit:4.0
MakeFriend依赖的junit:4.9
由于junit是test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。
2、需求:统一管理各个模块工程中对junit依赖版本
3、解决思路:将junit依赖版本统一提取到 “父” 工程中,再在子工程中声明junit依赖时不指定版本,以父工程中统一设定的为准,同时也便于修改。
4、操作步骤:
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>pompackaging>
project>
在子工程中声明对父工程的引用
<parent>
<groupId>com.atguigu.mavengroupId>
<artifactId>ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath>../Parent/pom.xmlrelativePath>
parent>
将子工程的坐标中与父工程坐标中重复的内容删除
在父工程中统一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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>pompackaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
project>
在子工程中删除junit依赖的版本号部分
如果需要重写,就保留
注意:配置继承后,执行安装时先安装父工程
1、作用:一键安装各个模块工程
2、配置方法:在一个 “总的聚合工程” 中配置各个参与聚合的模块
任何工程都可以做聚合,但大部分情况下是在父工程中做聚合
<modules>
<module>../Hellomodule>
<module>../HelloFriendmodule>
<module>../MakeFriendsmodule>
modules>
它会自己比对子工程间的关系,即使顺序不对也会正确安装
3、使用方法:在聚合工程的pom.xml上点右键→run as→maven install
Maven自动化部署一般来说不使用,该功能步骤比较繁琐已过时,现阶段的IDEA已经可以很好的完成部署任务。
pom.xml加入
<build>
<finalName>AtguiguWebfinalName>
<plugins>
<plugin>
<groupId>org.codehaus.cargogroupId>
<artifactId>cargo-maven2-pluginartifactId>
<version>1.2.3version>
<configuration>
<container>
<containerId>tomcat6xcontainerId>
<home>D:\DevInstall\apache-tomcat-6.0.39home>
container>
<configuration>
<type>existingtype>
<home>D:\DevInstall\apache-tomcat-6.0.39home>
configuration>
configuration>
<executions>
<execution>
<id>cargo-runid>
<phase>installphase>
<goals>
<goal>rungoal>
goals>
execution>
executions>
plugin>
plugins>
build>
其实这个命令不适合在eclipse里面使用,适合在命令行中使用。
在eclipse里面启动deploy会导致乱码,和无法关闭的情况发生。
我们可以到 https://mvnrepository.com/ 搜索需要的jar包依赖信息
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
正常只需要导入Maven依赖即可
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
dependencies>
但是有的工程中会缺少Maven Dependencies文件,不自动下载jar包
解决方案:
搜到的解决方案
在工程目录的.classpath文件中加入
加入后确实会出现Maven Dependencies文件
但是可能如果会报错:生成路径包含重复条目
Build path contains duplicate entry: 'org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER' for project 'WebProject'
但是为什么有该内容却没有Maven Dependencies文件呢?现在我还没有搞懂,但是删除刚才添加的信息后,报错会取消,同时Maven Dependencies文件也可以正常使用。
有的时候即使导入后任然红叉,就是用右键Maven→Update Project→√报错的项→ok,就可以解决
Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer
加入该条信息
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>WebProjectartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>warpackaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.1version>
plugin>
plugins>
build>
project>
解决方案1
解决方案2
Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. Select: Maven->Update Project... from the project context menu or use Quick Fix. WebProject line 1 Maven Configuration Problem
右键Maven→Update Project→√报错的项→ok
web.xml is missing and
右键选择Java EE Tools 选择 Generate… 点击