Maven详操作指南
学习目标
1. Maven 的环境搭建
2. Pom.xml 文件的使用
3. Maven 指令的使用
4. Idea 创建 Maven 项目
使用 Maven 改变传统项目构建
为什么使用Maven,解决了哪些痛点
1、对Maven的了解
1.1 什么是Maven
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目
1.2 Maven解决了哪些痛点
项目构建 :Maven将项目构建的过程进行标准化,每个阶段使用一个命令完成
依赖管理。
1.2.1如何构建项目
项目构建是一个项目从:源代码、编译、测试、打包、部署、运行的过程。
1.2.1.1 传统项目构建过程
原来构建项目的过程如下:以web项目为例
1 )在 idea 中创建一个 java web 工程
2 )在工程中编写源代码及配置文件等
3 )对源代码进行编译, java 源文件编译成 .class 文件
4 )执行 Junit 单元测试
5 )将工程打成 war 包部署至 tomcat 运行
1.2.1.2 Maven项目构建过程
Maven将项目构建的过程进行标准化,每个阶段使用一个命令完成
清理 : 删除以前的编译结果,为重新编译做好准备。
编译 : 将 Java 源程序编译为字节码文件。
测试 : 针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
报告 : 在每一次测试后以标准的格式记录和展示测试结果。
打包 : 将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web 工程对应war 包。
安装 : 在 Maven 环境下特指将打包的结果 ——jar 包或 war 包安装到本地仓库中。
部署 : 将打包的结果部署到远程仓库或将 war 包部署到服务器上运行
1.2.1.3 项目的构建方式
1、Ant
Ant只是一个项目构建工具,它没有对项目目录结构进行约定,需要手动指定源文件、类文件等目录地址,它没有集成依赖管理。
2、Maven
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
它对项目目录结构拥有约定,知道你的源代码在哪里,类文件应该放到哪里去。
Maven的生命周期是有顺序的,在执行后面的生命周期的任务时,前面任务一并被执行, 执行 mvn install 就可以自动执行编译,测试,打包等构建 过程
3、Gradle
1.2.2 什么是依赖管理
依赖:一个java项目可能要使用一些第三方的jar包才可以运行,那么我们说这个java项目依赖了这 些第三方的jar包。
依赖管理:对项目所有依赖的 jar 包进行规范化管理
1.2.2.1 传统项目的依赖管理
传统项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中。
手动拷贝jar包添加到工程中的问题是:
1 、没有对 jar 包的版本统一管理,容易导致版本冲突。
2 、从网上找 jar 包非常不方便,有些 jar 找不到。
3 、 jar 包添加到工程中导致工程过大。
1.2.2 .2 Maven 项目的依赖管理
Maven 项目管理所依赖的 jar 包不需要手动向工程添加 jar 包,只需要在 pom.xml ( Maven 工程的配置文件)添加jar 包的坐标,自动从 Maven 仓库中下载 jar 包运行。
使用 Maven 依赖管理添加 jar 的好处:
1 、通过 pom.xml 文件对 jar 包的版本进行统一管理,可避免版本冲突。
2 、 Maven 团队维护了一个非常全的 Maven 仓库,里边包括了当前使用的 jar 包, Maven 工程可以自 动从Maven仓库下载 jar 包,非常方便
1.3 使用Maven的好处
1、一步构建
Maven对项目构建的过程进行标准化,通过一个命令即可完成构建过程
2 、依赖管理
Maven 工程不用手动导 jar 包,通过在 pom.xml 中定义坐标从 Maven 仓库自动下载
3 、 Maven 的跨平台,可在 window 、 linux 上使用。
4 、 Maven 遵循规范开发,有利于提高团队的开发效率,降低项目的维护成本
2、Maven的安装与配置
2.1 Maven的下载
http://Maven.apache.org/download.cgi
2.2 Maven的安装
将下载好的 Maven 安装包解压到一个不含有中文和空格的目录中。 安装包解压即可使用。
2.3 配置Maven环境变量
前提必须有 java 的环境变量(推荐使用 JDK8 ):
配置Maven环境变量
通过 mvn -v命令检查 Maven是否安装成功
Error: JAVA_HOME not found in your environment.
添加JAVA_HOME后再输入mvn -v
maven安装与配置成功
2.4 修改Maven的配置文件
2.4.1 配置默认的JDK版本
Maven 默认使用 jdk1.7 ,我们常用的是 jdk1.8 ,所以直接在配置文件中修改。本人用的是jdk1.11
在配置文件中123行<profiles>标签下面添加如下标签
<profile>
<id>jdk-1.11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.11</jdk>
</activation>
<properties>
<Maven.compiler.source>1.11</Maven.compiler.source>
<Maven.compiler.target>1.11</Maven.compiler.target>
<Maven.compiler.compilerVersion>1.8</Maven.compiler.compilerVersion>
</properties>
</profile>
3 Maven的核心概念
3.1 Maven的目录结构
Maven 默认约定了一套目录结构 ,在通过 Maven 创建了项目以后,项目的目录结构就是以这套目录结构作为模板创建的。虽然Maven 提供了很多的模板,但是基本的目录结构都是固定的。
3.2 Maven的仓库
一个专门存放项目中依赖的第三方库的位置。
3.2.1 maven仓库的分类
maven的仓库可以分为本地仓库和远程仓库。
3.2.1.1 本地仓库
本地仓库相当于一个缓存,在电脑上是一个文件夹,我们可以修改这个文件夹的路径
工程第一次需要某种 jar 包时,会从远程仓库(互联网)下载并保存到本地仓库中 (在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到 才会去远程仓库上下载。
默认情况下,每个用户在自己的用户目录user下都有一个路径名为 .m2/respository/ 的仓库目录。但是在c盘,一般不使用,而是自己定义一个仓库路径。
3.2.1.2 远程仓库
远程仓库中分为中央仓库和私服两类
3.2.1.2.1 中央仓库(在国外)
中央仓库中的 jar 包由专业团队( Maven 团队)维护,中央仓库中存放了全世界大多数流行的开源软件的 jar包, 是Maven默认的远程仓库 。
要浏览中央仓库的内容, Maven 社区提供了一个 URL : http://search.Maven.org/#browse 。使用这个 仓库,开发人员可以搜索所有可以获取的代码库。
3.2.1.2.2 私服
私服是另一种特殊的远程仓库,为了 节省带宽和时间 ,应该在局域网内架设一个私有的仓库服务器,用 其代理所有外部的远程仓库。 内部的项目还能部署到私服上 供其他项目使用。(自己的项目可以打成包部署到私服上也当做第三方的jar使用)
除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有java.net Maven 库 ( http://download.java.net/maven/2/ ) 和 jboss Maven库 ( http://repository.jboss.com/maven2/ ) 等
3.2.2 配置本地仓库
当你运行 Maven 命令, Maven 将依赖下载到你指定的本地仓库中。
在 Maven 的安装路径下的 conf 文件中的 setting.xml 文件下添加如下内容:
PS :自己先新建一个文件夹作为本地仓库,路径不要有中文和非法字符。
<!-- 配置本地仓库 -->
<localRepository> D:\maven_repository </localRepository>
打开maven的setting.xml
3.2.3 配置远程仓库镜像
Maven 默认的远程仓库是 Maven 团队维护的中央仓库,由于网络原因,去中央仓库下载 jar 包需要到国外网站,不便捷,速度慢,于是我们可以选择把国内的阿里云的Maven 仓库作为中央仓库镜像
修改 Maven 根目录下的 conf 文件夹中的 settings.xml 文件,在 mirrors 节点上,添加内容如下:
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
id:当前镜像的唯一标识
mirrorOf:将哪个远程仓库当做中央仓库镜像,中央仓库的id是central,所以将阿里云的Maven仓库
设置为中央仓库镜像时,其值必须设置为central (*一个意思)
name:为当前的中央仓库镜像起一个名字,便于开发者阅读
url:阿里云Maven仓库的地址
3.3 Maven的核心文件pom.xml
POM( Project Object Model ,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
3.4 Maven的坐标
3.4.1什么是坐标
Maven 拥有大量构件,我们需要找一个用来唯一标识一个构件的统一规范。拥有了统一规范,就可以把查找工作交给机器
3.4.2 Maven坐标主要组成
groupId :定义当前 Maven 项目组织名称
artifactId :定义实际项目名称
version :定义当前项目的当前版本或者是所依赖的 jar 包的版本
<groupId> com.xzk </groupId>
<artifactId> demoProject </artifactId>
<version> 0.0.1-SNAPSHOT </version>
3.5 Maven的生命周期
3.5.1 什么是生命周期
Maven 生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测 试、部署等几乎所有构建步骤。生命周期可以理解为构建工程的步骤。
3.5.2 Maven三大生命周期
Maven 拥有三套 相互独立 的生命周期 , 分别是 clean 、 default 和 site.
clean Lifecycle : 在进行真正的构建之前进行一些清理工作。 mvn clean
default Lifecycle : 构建的核心部分,编译,测试,打包,部署等等。
site Lifecycle : 生成项目报告,站点,发布站点。
3.5.2.1 clean生命周期
clean的目的是清理项目。
每套生命周期都由一组阶段 (Phase) 组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比 如,运行mvn clean ,这个的 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段
包含 3 个阶段 :
1.pre-clean 执行一些清理前需要完成的工作
2.clean 清理上一次构建过程中生成的文件,比如编译后的 class 文件等
3.post-clean 执行一些清理后需要完成的工作
3.5.2.2 default生命周期- 构建项目
所有生命周期中最核心的部分,绝大部分工作都发生在这个生命周期中。
generate-resources : 产生主代码中的资源在 classpath 中的包
process-resource : 复制并处理资源文件,至目标目录,准备打包。
compile: 编译项目的主源码 . 一般来说 : 编译 src/main/java 目录下的 java 文件至项目输出的主
classpath 目录中
test-compile: 编译项目的测试代码 , 是编译 src/test/java 目录下的 java 文件至项目输出的测试
classpath 目录中
test: 使用单元测试框架运行测试 , 测试代码不会被打包或部署 .
package: 打包成可发布的格式
install: 将包安装到 Maven 本地仓库 , 供本地其他 Maven 项目使用
deploy: 将最终的包复制到远程仓库 , 供其他开发人员和 Maven 项目使用
PS :运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行 mvn install 的 时候,代码会被编译,测试,打包。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。
3.5.2.3 site生命周期-生成项目站点
目的:建立和发布项目站点
pre-site 执行一些在生成项目站点之前需要完成的工作 .
site 生成项目站点文档
post-site 执行一些在生成项目站点之后需要完成的工作 .
site-deploy 将生成的项目站点发布到服务器上
4、Idea搭建Maven项目
4.1 IDEA集成Maven插件(IDEA配置Maven环境)
在开发工具中集成 Maven 软件, idea 是 一个开发工具,Maven 是一个项目管理工具, Maven 有一套项目构建的规范,在 idea 集成 Maven 软件,最终通过idea 创建 Maven 工程。
1 、打开 IDEA ,进入主界面后点击 configure ,然后点击 settings
2 、在上面的快捷查找框中输入 Maven ,查找与 Maven 相关的设置,然后点击 Maven, 按如图配置。
或者直接进入File-Settings,输入maven
4.2 定义Maven坐标
每个Maven工程都需要定义本工程的坐标,坐标是Maven对jar包的身份定义。
将来将该工程项目放在本地仓库或者私服中当做第三方jar供给他人使用时,就需要这个坐标去找到这个jar包。
<!-- 项目名称,定义为组织名 + 项目名,类似包名 -->
<groupId> com.kkb </groupId>
<!-- 模块名称 -->
<artifactId> my-first-Maven </artifactId>
<!-- 当前项目版本号, snapshot 为快照版本即非正式版本, release 为正式发布版本 -->
<version> 0.0.1-SNAPSHOT </version>
<packaging > jar </packaging>
<!--packaging 表示打包类型
jar :执行 package 会打成 jar 包
war :执行 package 会打成 war 包
pom :用于 Maven 工程的继承,通常父工程设置为 pom
-->
4.3 创建Maven的java工程
4.3.1 使用骨架创建Maven的java工程
1 、选择 Create New Project 按钮
2、选中左侧的Maven,并将Create from archetype选中,在下方选择骨架quickstart,点击Next。
3 、填写项目名称以及存储的位置。点击下方的 Artifact Coordinates ,填写项目坐标的基本信息。
4、确认信是否正确
5、生成的目录结构
6 、手动将 Maven 文件夹补齐。
7、同样在test文件夹下创建resources文件夹,最后的目录结构:
4.3.2 不使用骨架创建Maven的java工程
1、新建一个工程,不使用骨架时直接在Maven下点击Next按钮
2、填写项目名称以及存储的位置。点击下方的Artifact Coordinates,填写项目坐标的基本信息。
3 、新建的项目 test 文件夹下没有 resources 文件夹,我们需要手动将 Maven 文件夹补齐。最后的目录结构:
4.4 创建Maven的java web工程
4.4.1 使用骨架创建Maven的java web工程
1 、选中左侧的 Maven ,并将 Create from archetype 选中,在下方选择骨架 webapp ,点击 Next
2、填写项目的名称以及存储的位置。点击下方的Artifact Coordinates,填写项目坐标的基本信息
3、创建的目录结构如下
4、补齐其他文件夹后的目录
4.4.2 不使用骨架创建Maven的java web工程
1 、新建项目 , 选择 Maven 。因为不使用骨架创建 Web 项目 , 所以不勾选 Create from archetype ,直接点击Next
3 、不使用骨架的 Web 项目已经创建完成了 , 下面是基本的结构 , 没有 web 目录
4 、我们需要手动添加 Web 目录 , 按照以下顺序添加 web 目录
5、点击Artifacts,加入刚才创建的内容
出来这个
6 、现在项目基本创建完成 , 点击 OK ,就完成了,下面就有 Maven 的 web 项目基本目录
另外,pom文件缺少一个标签
4.5 构建完整的Web项目
将刚刚创建的 web 项目中编写一个 jsp 页面和 servlet ,然后可以通过配置的 tomcat 插件方式运行项目
这里javax.servlet.jsp坐标点击按钮后仍无法下载下来,说明坐标不对,https://mvnrepository.com/
这是maven中央仓库的网址,进入后搜索javax.servlet.jsp
编写servlet
编写jsp
在pom中添加tomcat插件坐标
运行
这个名字也是可以修改的。
启动tomcat后,复制下面链接到浏览器就可以访问到页面了
在配置tomcat插件坐标时,还可以设置端口号和虚拟路径,默认端口号就是8080,虚拟路径是/
5、Maven常用指令
PS : Maven 的命令需要在 pom.xml 所在目录中执行以下命令。
上面的4.5中构建的maven项目,之前已经在IDEA中编译过了,生成了target目录存放字节码文件,现在删除该目录,通过maven命令去编译。
这就是maven构建项目标准化,每一个步骤都有对应的maven命令,通过命令让项目区编译、测试、打包、部署到仓库等
找到该maven项目的目录,复制路径I:\xzk\代码\maven_javaweb2
进入cmd,输入i:进入I盘,然后cd I:\xzk\代码\maven_javaweb2进入该项目,然后输入maven命令mvn compile编译该项目,生成target目录(存放字节码文件)
5.1 mvn compile
执行 mvn compile 命令,完成编译操作
执行完毕后,会生成 target 目录,该目录中存放了编译后的字节码文件。
5.2 mvn clean
执行 mvn clean 命令 , 执行完毕后,会将 target 目录删除。
5.3 mvn test
执行 mvn test 命令,完成单元测试操作。执行完毕后,会在 target 目录中生成三个文件夹: surefire 、 surefire-reports(测试报告)、 test-classes (测试的字节码文件)
5.4 Maven package
执行 mvn package 命令,完成打包操作
执行完毕后,会在 target 目录中生成一个文件,该文件可能是 jar 、 war
5.5 mvn install
执行 mvn install 命令,完成将打好的 jar 包安装到本地仓库的操作
执行完毕后,会在本地仓库中出现安装后的 jar 包,作为第三方包方便其他工程引用
然后去本地仓库查看,因为该maven工程项目在创建时设置的坐标中groupid是com.bowei.demo,
所以根据此可以在本地仓库找到
5.6 mvn clean compile 命令
cmd 中录入 mvn clean compile 命令
组合指令,先执行 clean ,再执行 compile ,通常应用于上线前执行,清除测试类
5.7 mvn clean test 命令
cmd 中录入 mvn clean test 命令
组合指令,先执行 clean ,再执行 test ,通常应用于测试环节
5.8 mvn clean package 命令
cmd 中录入 mvn clean package 命令
组合指令,先执行 clean ,再执行 package ,将项目打包,通常应用于发布前
5.9 mvn clean install 命令
cmd 中录入 mvn clean package 命令
组合指令,先执行 clean ,再执行 package ,将项目打包,通常应用于发布前
如果嫌dos中输入命令麻烦,可以直接在IDEA中操作这些maven命令
这里双击clean命令报错,可能是maven版本问题,默认使用maven1.7版本,现在通过坐标改成1.8版本,<version>一直飘红,那么3.8.0应该不对,改成3.1试试(主要是看远程仓库有没有)
6、Maven的传递性和依赖性
6.1 依赖管理
就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。
依赖声明主要包含如下元素:
Maven依赖管理的原理分析
6.2 依赖范围(scope标签的取值)
maven的依赖性是指在pom中通过scope标签设置依赖范围,也就是设置当前jar在哪些范围内有效的,比如当使用compile去设置servlet-api的依赖范围,那么在编译、测试、打包有效,若是war包,此时会把jar放进去,但是war是会被丢进tomcat中执行,tomcat中内置了相关jar包,包括servlet和jsp相关jar,那么这个时候就会出现依赖冲突,无法正常运行,当然如果设置servlet-api的依赖范围是provided,表示该依赖包已经由容器和JDK提供,只在编译时使用,打包时不会包含在目标中
总之,就是如果依赖包在容器或者JDK中已经提供了,那么依赖范围设置为provided,
如果容器和JDK中没有提供,那么依赖范围设置为compile,将依赖包也打入war包中。
6.2.1 compile-默认值
编译范围,默认 scope ,在工程环境的 classpath (编译环境)和打包(如果是 WAR 包,会包含在 WAR包中)时候都有效。
6.2.2 provided
容器或 JDK 已提供范围,表示该依赖包已经由目标容器(如 tomcat )和 JDK 提供,只在编译的 classpath 中加载和使用,打包的时候不会包含在目标包中 。最常见的是j2ee 规范相关的 servlet-api 和 jsp-api 等 jar 包,一般由servlet 容器提供,无需在打包到 war 包中,如果不配置为 provided ,把这些包打包到工程 war包中,在 tomcat6 以上版本会出现冲突无法正常运行程序(版本不符的情况)。
6.2.3 runtime
一般是运行和测试环境使用,编译时候不用加入 classpath ,打包时候会打包到目标包中。一般是通过动 态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar 包扫描动态加载的情况。典型的包括: JDBC 驱动等。
6.2.4 test
测试范围,一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等。
6.2.5 system(一般不用,不同机器可能不兼容)
系统范围,与 provided 类似,只是标记为该 scope 的依赖包需要明确指定基于文件系统的 jar 包路径。因 为需要通过systemPath 指定本地 jar 文件路径,所以该 scope 是不推荐的。如果是基于组织的,一般会建 立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该scope 的情况。
6.3 依赖传递
6.3.1 直接依赖和间接依赖
如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖。
C->B B->A
C直接依赖B C间接依赖A
在pom中写了3个依赖,现在有4个,其中junit下还有一个依赖(简写ham),junit需要使用ham,那么ham就是junit的直接依赖,假设此时有个依赖A需要使用junit依赖,那么此时junit就是A的直接依赖,ham是A的间接依赖。
6.3.2 依赖范围对传递依赖的影响
左边第一列表示第一直接依赖范围
上面第一行表示第二直接依赖范围
中间的交叉单元格表示传递性依赖范围。
定义在标签
总结:
(1) 当第二依赖的范围是 compile 的时候,传递性依赖的范围与第一直接依赖的范围一致。
(2) 当第二直接依赖的范围是 test 的时候,依赖不会得以传递。
(3) 当第二依赖的范围是 provided 的时候,只传递第一直接依赖范围也为 provided 的依赖,且传递性依赖的范围同样为 provided ;
(4) 当第二直接依赖的范围是 runtime 的时候,传递性依赖的范围与第一直接依赖的范围一致,但
compile 例外,此时传递的依赖范围为 runtime ;
6.4 依赖冲突
(1) 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)
(2) 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)
6.5 可选依赖
true/false 用于设置是否可选,也可以理解为jar包是否向下传递。
在依赖中添加 optional 选项决定此依赖是否向下传递,如果是 true 则不传递,如果是 false 就传递,默认为false 。
6.6 排除依赖
Maven 的传递依赖能自动将间接依赖引入项目中来,这样极大地简化了项目中的依赖管理,但是有时候间接依赖的关联包可以因为版本或其他原因,并不是我们想要的版本,那该怎么办呢?
这种做法就是排除依赖。那怎么实现排除依赖呢?实现排除依赖还是比较简单的,在直接依赖的配置里面添加 exclusions → exclusion 元素,指定要排除依赖的 groupId 和 artifactId 就行,如下面代码所示。
说明:排除依赖包中所包含的依赖关系,不需要添加版本号。
排除前
排除后
直接排除依赖方式解决依赖冲突问题,就在IDEA的Maven中看有没有依赖相同(只看groupID和ArtifactID,只要这俩相同,不管版本号如何,二者只留一个),
7、Maven插件
Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。每个插件都能实现一个功能,每个功能就是一个插件目标。Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如compile就是插件Maven-compiler-plugin的一个插件目标。
7.1 Maven编译插件
7.2 Tomcat插件
我们之前创建的 web 项目都需要额外配置 tomcat 以后才能运行项目,现在 Maven 提供了 tomcat 插件,这样我们就无需再添加额外的tomcat 了。
步骤 1: 创建 Maven 类型的 web 工程
步骤 2: pom.xml 文件中添加插件信息
步骤3:点击“add configuration”,按照图片中的步骤添加tomcat命令,运行tomcat插件
命令:tomcat7:run 运行tomcat7(推荐,但是需要添加插件)
8、Maven私服-了解
问题:项目组编写了一个通用的工具类,其它项目组将类拷贝过去使用,当工具类修改 bug 后通过邮件发送给各各项目组,这种分发机制不规范可能导致工具类版本不统一。
解决方案:项目组将写的工具类通过 Maven 构建,打成 jar ,将 jar 包发布到公司的 Maven 仓库中(私服),公司其它项目通过Maven 依赖管理从仓库自动下载 jar 包。
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的 Maven 远程仓库,每个员工的电脑上安装Maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar )。
私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图:
私服作用:
1 、将自己的工程打包 jar 发布到私服
2 、从私服下载 jar 包到自己的工程中
9.java项目中引用本地其他项目
技能目标:搭建 Maven 环境,使用 Maven 进行 jar 包管理,并实现项目代码安装到本地仓库, 其他项目可以引用该代码
业务目标:项目组员无需复制繁琐的 jar 包也能实现项目开发,自身代码可以实现实时性共享
整个流程:
1. 搭建 Maven 环境
2. 创建 Maven 项目 A,并添加需要的 jar 包依赖
3. 将项目 A 通过 Maven 指令安装到本地仓库
4. 创建 Maven 项目 B,在项目 B 中引用 A 项目的依赖包
5. 在 B 项目中编写测试类,调取 A 项目信息并运行结果
使用maven将项目A安装到本地仓库,然后在项目B中添加项目A的依赖。
就是maven将A打包到本地仓库,然后B项目pom中通过A的坐标把A引用到B中,在B中调用A中方法
1)创建maven项目mavenA
创建maven项目mavenB,添加mavenA的依赖
mavenA作为maven的依赖,坐标如下:
<groupId>com.bowei.maven</groupId>
<artifactId>mavenA</artifactId>
<version>1.0-SNAPSHOT</version>