day-12-maven
一、Maven概念
1.什么是Maven
1.1 举例
案例一:
问题:
假如你正在使用idea开发两个Java项目,它们称为项目A、项目B,其中项目A中的一些功能依赖于项目B中的某些类,那么如何维系这种依赖关系的呢?
解决办法
需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。
缺陷
1.如果在开发过程中,发现B中的bug,则必须将B项目修改好,并重新将B打包并对A项目进行重编译操作
2.如果我们所依赖的jar包,功能修改了,我们要想使用修改过后的新功能,必须重新打包,添加到我们的项目中
案例二:
问题
一个公司有可能同时开发好几个项目,那么这几个项目,都是要用到相同的几十个jar包,怎么解决这个问题?
解决办法
其实这个问题很好解决,我们只需要把这些jar包给整理好,那个项目中要用到这些jar包,我们就把jar包复制到那个项目中即可!
缺陷
会导致每个项目体积很大,体积很大的一个原因就是因为jar包太多,而且还不好管理,如果我们不小心导入了重复的jar包,出现了jar包冲突的问题,那这个问题就不太好解决了
总结:
上面两个问题的描述,其实都属于项目与项目之间依赖的问题,如果我们人为手动的去解决,很繁琐,也不方便,所以使用maven来帮我们管理
1.2 Maven概念
Maven是一个Apache公司的开源项目,是项目构建工具。用来管理依赖。
使用maven可以在项目中不用导入项目依赖的jar包,省去了下载和导入jar包的过程,使项目的大小等到了缩减。
2.Maven的主要两大功能
2.1依赖管理
将jar包进行统一管理存放到一个文件夹中(仓库),要用到jar包,我们就去文件夹中(仓库)中取(jar包的坐标),就可以了
2.2一键构建
从项目的编译 、测试、运行、打包、安装、部署等一系列的动作(称为项目的生命周期),都由maven来管理
一个项目对于开发来说,生命周期是这样的:搭建项目结构、编码、跑测试用例、编译、打包、发布到环境测试、发布到生产环境。其中除了编码之外,大多数时间都是在编译、打包、发布到测试环境,然后测试开始测试,测试提出bug,开发接着修改bug,之后又进行自测、编译、打包、发布到测试环境,多数时间都在重复着跑单元测试、编译、打包、发布的工作。
3.Maven的下载与安装
3.1 下载
下载地址:http://archive.apache.org/dist/maven/maven-3/
3.2 安装
省略:参考《maven基础文档》即可
4.仓库的种类和彼此关系
-
本地仓库
Maven会将工程中依赖的Jar包从远程下载到本机一个目录下管理.
每个电脑默认的仓库是在 $user.home/.m2/repository下,一般我们不使用默认的仓库,需要自己设置仓库目录
-
修改默认仓库
找到maven软件的目录,例如:D:\soft\developsoft\apache-maven-3.5.2,
找到settings.xml配置文件,并修改
-
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <localRepository>D:/soft/developsoft/repository_maven</localRepository> </settings>
-
-
私服仓库
私服也是远程仓库中的一种,我们为什么需要私服呢?
如果我们一个团队中有几百个人在开发一些项目,都是采用maven的方式来组织项目,那么我们每个人都需要从远程仓库中把需要依赖的构件下载到本地仓库,这对公司的网络要求也比较高,为了节省这个宽带和加快下载速度,我们在公司内部局域网内部可以架设一台服务器,这台服务器起到一个代理的作用,公司里面的所有开发者去访问这个服务器,这台服务器将需要的构建返回给我们,如果这台服务器中也没有我们需要的构建,那么这个代理服务器会去远程仓库中查找,然后将其先下载到代理服务器中,然后再返回给开发者本地的仓库。
-
注意:连接私服,需要单独配置。如果没有配置私服,默认不使用
-
私服的好处
1.加速maven的下载速度 2.节省宽带 3.方便部署自己的构件以供他人使用 4.提高maven的稳定性,中央仓库需要本机能够访问外网,而如果采用私服的方式,只需要本机可以访问内网私服就可以了
-
配置私服
<mirrors> <!-- 配置阿里的私服 --> <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
-
-
中央仓库
Maven内置了远程公用仓库:http://repo1.maven.org/maven2 这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主
工程依赖的jar包如果本地仓库没有,默认从中央仓库下载
-
中央仓库的特点:
1.中央仓库是由maven官方社区提供给大家使用的 2.不需要我们手动去配置,maven内部集成好了 3.使用中央仓库时,机器必须是联网状态,需要可以访问中央仓库的地址
-
5.Maven标准目录结构
pom.xml 核心配置
src/main/java java源码
src/main/resources java配置
src/main/webapp web项目中 WebRoot目录
|-- WEB-INF
|-- web.xml
src/test 测试
target 输出目录
6.Maven的常用命令
clean: // 消除所有编译后的资源
compile: // 编译mavent程序
test: // 不仅编译,而且执行测试代码(将所有的测试代码,都会执行一遍)
package: // 不仅编译,而且测试,还打包
install: // 不仅编译、测试、打包、而且把打包的程序,放在了本地仓库
7.Maven的生命周期
clean生命周期
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
8.Maven模型图
二、idea集成Maven
1.idea安装Maven
第一步:
第二步:在第一步的操作基础上,配置runner
-DarchetypeCatalog=internal -Dfile.encoding=GBK
2.创建maven工程
2.1 使用骨架创建maven的java工程
2.2 不使用骨架创建maven的java工程
2.3 使用骨架创建maven的web工程
操作步骤: 省略
2.4 指定web资源
java --> 只放java代码,不用放jsp页面
webapp --> 页面jsp 和 静态资源 <packaging>war</packaging>
在创建好的工程中,有的时候少了一个目录,resources 。
我们需要自己手动创建文件夹resources,并选中此文件夹,右键--> Mark Directory as --> Test Resources Root
2.5 在maven工程中,导入jar包
在pom文件中:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.6 解决jar包冲突问题
在<dependency>标签中添加<scope>标签值为provided
解释说明:
scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。
compile
默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会打到包里去。
test
该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如junit,它只有在编译测试代码及运行测试的时候才需要。
runtime
依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。
此类的驱动都是为runtime的类库。
provided
该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
system
使用上与provided相同,不同之处在于该依赖不从maven仓库中提取,而是从本地文件系统中提取,其会参照systemPath的属性进行提取依赖。
import
这个是maven2.0.9版本后出的属性,import只能在dependencyManagement的中使用,能解决maven单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0AbgwZa-1578568320820)(scope.jpg)]
2.7 在maven中添加插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
org.apache.maven.plugins maven-compiler-plugin 1.8 1.8