本学习笔记根据慕课视频【Maven项目依赖管理】摘录,主要学习maven的使用方式,从理念到实践、基础到应用,掌握基于maven管理java项目的方式。
目录
第一章 Maven概述
Maven简介
Maven环境搭建
第二章 Maven快速入门
Maven项目的创建
第一个依赖和插件
运行项目的两种方式
Batch Model问题
Maven工具和项目的文件结构
Maven基础操作
仓库
maven配置
maven软件坐标
maven操作命令
maven生命周期
手工创建maven项目
MVN命令创建Maven项目
使用工具构建Maven项目
archetype项目骨架加载慢的问题
Maven高手进阶
Maven依赖管理范围
Maven父子项目依赖传递
Maven项目聚合统一管理
Maven项目常见插件
Nexus私有服务器
Maven应用
Maven构建JavaSe项目
Maven构建JavaWEB项目
Maven依赖直接冲突的问题
Maven依赖传递冲突的问题
Maven :一个用于自动化构建项目和管理项目依赖的工具
自动化构建项目:按照企业中主流的项目模板,创建完善的项目结构
管理项目依赖:配置式添加和管理,自动下载和导入项目依赖
对比:
传统的基于SSM构建的java web项目,第三方jar包需要从网站下载存放到java web项目的WEB-INF的lib目录下。弊端:需要手动下载并存放,如果jar多,导致效率低,容易发生冲突。涉及jar版本更改时不易管理。
使用maven构建的基于SSM构建的java web项目:在pom.xml中添加项目依赖 好处:依赖的jar包只需把依赖信息存在pom.xml中,maven自动完成jar包下载引用。对jar版本更改时修改版本配置并更新即可。
类似于自己去超市购物和网上购物的区别。
MAVEN_HOME :1.x版本需配置。目前主流使用3.x版本,不再需要配置此环境变量
PATH:3.x需配置
M2_HOME:2.x版本配置
1.确认是否配置好java环境
2.下载Maven
访问官方网站,download栏中选择对应的版本进行下载(bin.zip),解压安装。
3.配置maven
复制maven的bin文件夹路径(D:\maven\apache-maven-3.6.3\bin)配置到path环境变量。
操作:【此电脑】--【右键属性】--【高级系统设置】--【环境变量】--【系统变量】--【path】--【编辑】--【新建】--【复制粘贴的路径】--【确定】
此例使用IDEA搭建
1.完成本地maven的初始化配置
1.在创建项目界面点击configure,settings。
2. 将idea自带的maven改为本地安装的maven(maven home directory-->D:/maven/apache-maven-3.6.3),并把关于maven的配置改为自己配置的(user setting file-->D:\maven\apache-maven-3.6.3\conf\settings.xml),本地仓库根据喜好更改
更改后:
2.创建maven项目
1.【create new project】-- 【maven】--【勾选CREATE FROM 】--[MAVEN WEBAPP]--【NEXT】
2.得到项目信息配置。 name: 项目名 location:项目地址 GroupId:当前项目公司名称 Artifactid:当前项目模块名称 Version:项目版本
next后得到项目信息确认,点击finish完成项目的构建
此时idea会自动连接maven的远程仓库,同步数据到本地并且完成项目的构建
构建web项目时,需要基于servlet,jsp开发,手工构建项目时,需要导入两者的依赖,才能使用它们的jar包,maven项目中怎么实现依赖的导入?不用手动下载,只要找到两个依赖jar包的地址,把地址配置到pom.xml中即可完成依赖的导入。
下面演示servlet和jsp jar包的下载和引用:
1.访问maven依赖的检索网站,搜索需要的依赖(此例为servlet),点击3.1版本,复制下图红框中的依赖描述到当前项目pom.xml中的dependencies的依赖下面。下载jsp同理
粘贴进来后点击右上角LOAD MAVEN CHANE图标进行依赖的下载和引用。
若要修改jar包版本,只要更改version 版本并更新即可。
下面演示tomcat插件下载引用
访问maven的官方网站,左侧导航栏选择plugins
选择apache tomcat,配置tomcat 7的依赖信息,复制到
1.如下图操作
2.运行项目
会出现项目运行所需下载的资源信息。浏览器中输入地址访问验证项目
配置本地安装的tomcat,点击OK
配置完成后需要把项目发布到tomcat中去。点击ok,可以看到项目发布进来了。
启动tomcat完成项目的本地启动
个人一开始测试没成功,检查下来发现没有选择本地安装的JDK。Using JRE_HOME: "D:\intellijidea\IntelliJIDEA\jbr"路径需为本地配置的jre_home。
参考建议:idea 使用tomcat运行maven项目
问题:创建Maven项目,挂死在构建项目环节[INFO] GENERATING project in Batch mode
原因:防火墙,阻止/延缓了访问在国外的Maven仓库。
解决:访问Maven 国内镜像仓库
配置:D:\maven\apache-maven-3.6.3\conf\settings.xml
在maven配置文件中添加配置
aliyun
aliyun
central
http://maven.aliyun.com/nexus/content/groups/public/
文件结构
maven本质的核心是一个下载工具的作用。构建项目时从中央仓库下载模板描述文件,并找到合适的模板完成项目结构的创建,下载依赖插件等到本地仓库,完成本地存储。通过描述文件将本地仓库中已经处理好的依赖插件引入到项目中使用。
主要包括以下目录:
bin:存放二进制可执行文件。包括主要的执行命令mvn
boot:存放maven的类加载器。用于加载自身的jar包类库。
conf:存放maven配置文件。包含主要配置文件settigns.xml
lib:存放自身jar包
uselibs:自定义目录,用于本地仓库使用,方便管理maven中的各种依赖
其他:版本说明文件
通过maven构建的项目开发结构
src:包含项目开发时主要的业务代码。
main文件夹编写业务代码
java文件夹存放具体的业务代码,构建包,类型...
resources存放各种资源文件和配置文件,以及一些静态项目
webapp:web项目中存在,包含web开发中需要的视图文件
target:存放src总的代码编译后生成的模板二进制文件
pom.xml(project object model:项目对象模型\package object management:依赖包对象管理器)。核心配置文件
远程仓库/中央仓库
用于maven官方服务器中存储各大技术社区和企业开发的软件工具,方遍开发人员在构建项目时从这个仓库统一进行依赖的下载。实际操作中,Maven的远程仓库在国外,国内访问不方便,在国内的一些企业或社区会部署镜像的远程仓库,定时同步maven在国外的中央仓库数据。
本地仓库
开发人员在创建项目时存储项目依赖的本地文件夹。默认存储在:C:/User/用户名/.m2/repository/,实际操作中会通过配置来自定义本地仓库在计算机中的位置。
私有服务器
企业开发项目时大部分依赖会从中央仓库下载,少部分特殊依赖是公司内部开发的一些jar包工具,常规做法是公司内部搭建私有服务器,部署项目依赖,服务公司内部项目。
本地仓库和国内镜像仓库可通过编辑配置文件setting.xml来完成指定。
Maven中本地仓库的配置:MAVEN_HOME/conf/settings.xml:localRepository
D:/maven/apache-maven-3.6.3/usrlibs
Maven中远程镜像仓库的配置:MAVEN_HOME/conf/settings.xml:mirrors>mirror
aliyun
aliyun
central
http://maven.aliyun.com/nexus/content/groups/public/
接下来打开自己的项目查看
File--Setting,可以看到本地仓库的路径已经更新
对当前项目做更新,将所有的依赖同步到新的本地仓库。右击项目,选择maven,reload project将依赖导入新的仓库
也可以直接将原仓库的文件内容复制到新仓库文件夹。
Maven核心组件:配置(广度学习即可,随时查用)
全局配置:settings.xml,maven的全局配置文件,主要通过配置的方式管理maven 自身的各项操作,包括对于本地仓库,远程仓库的配置以及认证信息各种配置项。
${user.home}/.m2/repository
true
false
false
org.apache.maven.plugins
server_001
my_login
my_password
${usr.home}/.ssh/id_dsa
some_passphrase
664
775
nexus aliyun
Nexus Aliyun
http://downloads.planetmirror.com/pub/maven2
central
myproxy
true
http
proxy.somewhere.com
8080
proxyuser
somepassword
*.google.com|ibiblio.org
test
env-test
false
1.5
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
${basedir}/file2.properties
${basedir}/file1.properties
5.2.8
codehausSnapshots
Codehaus Snapshots
false
always
warn
http://snapshots.maven.codehaus.org/maven2
default
配置JDK,在项目构建时默认完成JDK配置
jdk-1.8
true
1.8
1.8
1.8
1.8
项目配置:pom.xml
如果配置文件中出现相同的配置项,默认级别pom.xml(项目配置)>setting.xmlnote(用户配置)>settings.xml(全局配置)
4.0.0
asia.banseon
banseon-maven2
jar
1.0-SNAPSHOT
banseon-maven
http://www.baidu.com/banseon
A maven project to study maven.
Demo
[email protected]
[email protected]
[email protected]
http://localhost:8080/demo/dev/
HELLO WORLD
youname
[email protected]
Project Manager
Architect
demo
http://www.xxx.com/
No
+8
Apache 2
http://www.xxxx.com/LICENSE-2.0.txt
repo
A business-friendly OSS license
scm:svn:http://svn.xxxx.com/maven/xxxxx-maven2-trunk(dao-trunk)
scm:svn:http://svn.xxxx.com/maven/dao-trunk
http://svn.xxxxx.com/
demo
http://www.xxxxxx.com/
jira
http://jira.xxxx.com/xxxx
......
......
Windows XP
Windows
x64
6.1.7100
mavenVersion
2.0.3
/usr/local/xxxx/xxxx-home/tomcat/maven-guide-zh-to-production/workspace/
/usr/local/xxxx/xxxx-home/tomcat/maven-guide-zh-to-production/workspace/
......
......
......
......
......
......
banseon-repository-proxy
banseon-repository-proxy
http://10.10.10.123:8080/repository/
default
......
......
org.apache.maven
maven-artifact
3.8.1
jar
test
spring-core
org.springframework
true
xxx-maven2
xxx maven2
file://${basedir}/target/deploy
xxx-maven2
xxx-maven2 Snapshot Repository
scp://svn.xxxx.com/xxx:/usr/local/maven-snapshot
banseon-site
business api website
scp://svn.baidu.com/xxx:/var/www/localhost/web
基础组件:gav坐标
groupId:项目ID,当前项目和其他项目的唯一标志
artifactId:组件ID,当前项目的子应用或者子组件的唯一标志
version:版本号,迭代开发时标志的产品版本信息
例:
lo4j 1.2.17
org.apache.log4j.Logger
版本号的意义:
软件名称.主版本号.小版本号.阶段版本号.字母版本号
主版本号:软件重大功能新增和修改
小版本号:子版本号,小功能新增和修改
阶段版本号:bug修复和完善
字母版本号:里程碑版本 ALPHA(内测) BETA(公测) RC(后线,即将发行) STABLE(正在发行的稳定版本) RELEASE/R/GA (正在发行的稳定版本) FINAL(最终版本,稳定版本)
mysql
mysql-connector-java
8.0.21
maven是一个项目构建和管理工具,是基于pom.xml项目对象模型的方式来管理项目的构建过程,依赖注入和报表文档。这些操作maven在底层都是通过命令的方式来执行完成。
mvn --version :查看当前的maven版本
mvn archetype:generate :用于项目构建
mvn clean:清理项目中编译生成的文件数据的命令,清除target目录下生成的文件数据
mvn compile:用户编译项目,将java源代码文件编译成对应的字节码文件,并将编译好的文件存储到package目录中
mvn package:打包编写的项目,生成对应的jar包,存储到package目录中方便后期的部署使用
mvn tomcat :run 使用maven中内置的tomcat插件运行项目
mvn test:自动执行test目录中的测试案例,生成对应的测试报告文档
mvn site:生成报表数据
mvn dependency:tree 查看当前依赖树
mvn insatll: 安装命令,将打包好的jar包添加到本地仓库中,方便其他项目通过坐标引用
mvn deploy:将安装在本地仓库中的jar包发布到私有服务器或镜像仓库,方便其他项目远程通过gav坐标引用
生命周期:描述项目构建过程 预定义项目执行过程 降低项目管理难度
提供三套独立的生命周期,是maven三种不同的操作模式
clean lifecycle:项目构建之前的清理环节
default lifecycle:项目编译和打包环节
site lifecycle: 项目报告、站点信息、发布环节
底层纯手工构建
依次创建上图中的目录文件夹,target文件是mave项目在编译过程中自动创建。在damu 文件夹下新建HelloWorld的java代码。
编写pom.xml文件。配置头从官方网站查询下载(maven.apache.org),documenation部分的user center中getting started guide
4.0.0
org.example
trains-02
1.0-SNAPSHOT
jar
...
...
在项目的命令行中管理
mvn clean
mvn compile
mvn package
运行当前的maven项目
mvn exec:java -Dexec.mainClass="com.damu.HelloWorld"
通过命令使用模板快速构建
3.0.5版本后使用generate命令,添加-D参数
构建过程:在工作空间的命令行中
mvn archetype:generate
-DgroupId=prg.example
-DartifactId=trains-03
-DpackageName=com.example
-DarchetypeArtifactId=maven-archetype-quickstart
自动生成pom.xml
4.0.0
org.example
trains-03
jar
1.0-SNAPSHOT
trains-03
http://maven.apache.org
junit
junit
3.8.1
test
运行项目
mvn exec:java -Dexec.mainClass="org.example.App"
开发工具:IDEA
构建环境:jdk 1.8,maven 3.6
构建骨架:archetype-catalog.xml
file--new--project
完成项目的构建
有两个问题:1.创建项目之初,archetype项目骨架加载慢 2.构建的项目servlet版本是2.3,不利于现阶段web项目开发。需要改造项目骨架。
Archetype Created Web Application
官方网站下载archetype-catalog.xml文件(https://repo.maven.apache.org/maven2/archetype-catalog.xml)
文件存放到当前的本地仓库中(D:\maven\apache-maven-3.6.3\usrlibs\org\apache\maven\archetype\archetype-catalog\3.2.0)
重新配置maven
-DarchetypeCatalog=local
使用提供的项目骨架或自定义的项目结构尝试
什么是依赖范围 依赖的jar包在maven的生命周期里作用的范围
有哪些依赖范围
为什么要设置依赖范围
如servlet-api容器相关的依赖,这些依赖在项目开发时在代码中需要引入servlet jar包,但在运行时web容器本身自带了servlet jar包,如tomcat,如果将项目中依赖的servlet打包起来,发布之后在tomcat运行时会和tomcat自带的servlet产生冲突,所以类似servlet,jsp在编译运行的时候引用,发布时不需要添加。
默认依赖范围是complie,所以运行会报错
将范围改为provided,只在运行编译时有效
javax.servlet
javax.servlet-api
3.1.0
provided
父子项目:maven中为了合理有效的管理依赖jar包建立的一种项目间的关系
项目间的依赖关系怎么建立
构建父项目mcex01_parent
更改如下
pom
UTF-8
1.7
1.7
4.11
5.2.8.RELEASE
1.2.17
junit
junit
${junit.version}
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
log4j
log4j
${log4j.version}
新建子项目mcex01-wiki
编辑pom.xml
可以看到父项目中写在dependencies中的依赖被默认添加进来了,但写在dependencyManagement中的没有继承进来
>
org.example
mcex01_parent
1.0-SNAPSHOT
../mcex01_parent/pom.xml
mcex01_wiki
1.0-SNAPSHOT
log4j
log4j
子项目通过parent标签实现对父项目的继承关系,同时父项目中dependencies和dependencymanagement用于统一管理多个子项目中使用的多个jar包的统一版本。通过父项目管理依赖实现多个子项目依赖的复用
注意:
父子项目项目之间的系统集成性能较差,如果需要进行统一的部署测试,需要对每个项目进行打包,最后将所有打包结果集成在一起。
项目聚合:maven中针对多个项目进行统一打包的管理方式。间接的提高了多个项目统一维护管理的便捷性。把多个子项目当成独立的模块,包含到一个整体的项目中,实现多个模块的整合管理。
新建父项目mcex02_aggregation。接下来在父项目中创建多个子项目,此时的子项目以模块的形式出现。点击父项目--new--Module
pom.xml
pom
mcex02_wiki
构建子项目mcex02_aggregation
pom.xml
mcex02_aggregation
org.example
1.0-SNAPSHOT
项目聚合关系,项目之间的整体性较高,便于系统集成和维护 。同时结合项目的继承关系,提高依赖的复用性。聚合和继承复合是常用的开发方式。
maven中的插件是针对maven工具对其功能进行增强型管理的模块。
生命周期插件 resources/source/clean/complie
常用操作插件 tomcat7/denpendency/jar/...
插件在
常用插件:可在官网查看具体用法
私有服务器是企业内部为了方便统一管理项目依赖搭建的web服务器
通常在企业中为了合理管理项目依赖,架设私有仓库将项目中的一些公共依赖以及内部私有依赖存放到私有仓库,保证团队内部的依赖共享和敏感依赖的安全性。
构建私有仓库的技术主要有:Apache Archiva,JFrog Artifactory,Sonatype Nexus(主流)
下载Nexus.官方网站
启动私有服务器:nexus /run
第一次启动速度可能慢
出现如图所示表示启动完成
启动完成后访问本地服务器http://localhost:8081
私有服务器仓库分三种
proxy:代理远程仓库,远程仓库和本地仓库之间的私有仓库
group:仓库分组管理
hosted:发布本地仓库
构建针对中央仓库的私有仓库maven2(proxy)
项目中需要连接这个私有仓库可以点击copy来完成
创建发布仓库maven2(hosted)
创建发布快照版本仓库maven2(hosted)
创建好的仓库添加到maven项目中
在创建的项目pom.xml中
my nexus
My Nexus
http://localhost:8081/repository/my_nexus/
ture 支持稳定版本的依赖jar包
true
/snapshots>
发布管理器
mc-example-release
Mc Example Release
http://localhost:8081/repository/mc_example_release/
mc-example-snapshot
Mc Example Snapshot
http://localhost:8081/repository/mc_example_snaoshot/
优先从本地仓库---私有仓库--中央仓库查询依赖
发布项目
连接私有服务器
maven的setting.xml中
mc-example-snapshot
admin
配置的密码 d.
mc-example-release
admin
配置的密码 d.
点击deploy发布项目
JavaSE项目是使用纯java代码开发的基本应用,构建的过程中需要开发程序的入口类并且指定具体的main方法
IDEA构建基于maven的JavaSE项目
file--new--project,不选骨架直接next,
在main的java中新建java class如class文件,在pom.xml中配置依赖如logj。在resourecs中新建log4j定义的配置文件log4j.properties,上log4j官网查询配置信息,最终在hello程序中应用引入的jar包。
JavaSE运行的两种方式
一:当前文件--右键--运行
在控制台直接输出运行结果
二:在edit configure中增加maven运行命令
exec:java -Dexec.mainClass="com.example.HelloWorld"
以maven模式构建并运行当前项目
以java语言为核心,结合前端、数据库、网络服务器等构建出来的全栈运用。
IDEA构建基于maven的Java Web项目
file--new--project,选择骨架webapp(隐藏底层构建细节)/手工构建,直接next。
手工构建
main下新建文件夹webapp,webapp下新建WEB-INF文件夹,WEB-INF文件夹下新建web.xml核心配置文件
file-project struct--modules--+--web--选择web.xml和webapp的相应路径--create artifacts
webapp--右键新建jsp
web项目最终要打成war包,在pom.xml中添加
javaweb的开发项目需要依赖servlet,servlet是web容器中的jar包,将servlet引入,在pom.xml添加依赖
javax.servlet
javax.servlet-api
3.1.0
provided
在java文件夹中新建业务代码
package com.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("hello web");
}
}
运行一:通过命令项目启动,增加tomcat插件
运行二:使用本地tomcat
出现引用的依赖是不同的版本时,通常将最新的版本引入进来(版本向后兼容)
使用依赖树查看依赖关系
排除相冲突的低版本依赖
g..
a..
v..
commons-logging
commons-logging
模拟:构建项目a,b,c,分别做jar包的打包安装,a依赖b,c,本身的项目A依赖a,可以看到a,b,c都引用进来了,但本身的项目不依赖c
g..
a..
v..
c
以上两种冲突的解决方案相同,使用