文章目录
Maven的介绍:
问题:
我们在开发中经常会使用到别人已经开发好的代码。将别人的代码提供的jar包文件
导入到本地项目中,比如SSM项目。A开发需要使用B开发的代码,则需要B将其
代码导出jar包,并提供给A,A在将其导入到项目中使用,而Jar包之间有依赖关系。
我们还需要将B的jar包的依赖包也要导入到A中,所有的动作都是基于手动的。太过于麻烦
而且很容易遗漏jar包文件。
手动:
1、B手动导出jar文件
2、A手动导入B的jar到项目
3、A要自己记住B的依赖关系来导入依赖的jar包
解决:
手动变成自动
方案:
发明一款软件,将不同的项目之间建立联系。
实现:
Maven项目管理软件
好处:
可以方便的对项目之间的依赖关系进行管理。
项目拆分。
专业术语:
本地仓库:Maven工具在本地存储jar文件的路径
私服:局域网中的仓库
中央仓库:互联网中,云端
坐标:唯一标识一个jar文件的数据
使用:
1、在Maven软件的配置文件中配置
配置本地仓库
配置中央仓库
配置jdk版本
2、eclipse集成Maven
3、创建Maven Project
总结:
其实所谓Maven,就是一个项目管理工具,通过Maven工具创建的项目之间可以间接的联系起来。
Maven是什么?
官方的解释:
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),
一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management
System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven
可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven两大核心:
依赖管理:就是对jar包的统一管理
构建项目:项目编码完成后,对项目的编译,测试,打包,部署等操作
仓库类型 | 说明 |
---|---|
本地仓库 | 程序员自己电脑上的仓库 |
私服仓库 | 局域网中的仓库 速度比中央仓库要快 |
中央仓库 | 在互联网中,由Apache团队维护 包含了基本所有的jar包 版权原因不包含Oracle的驱动包 |
Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象。
这些对象通过一个名为项目对象模型(Project Object Model, POM)的XML文件描述。
这个POM告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出。
同样的方式,一个Java Web应用有一个web.xml文件来描述,配置,及自定义该应用,一个Maven项目则通过一个 pom.xml文件定义。
该文件是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。
maven坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
1. dependencies
在dependencies标签中添加需要依赖的jar对应的maven坐标
2. dependency
一个dependency标签表示一个maven坐标
3. groupId
团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId,一个maven坐标必须包含一个groupId必须的
4. artifactId
在groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.) ,必须的
5.version
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。
虽然项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的 groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。必须的
scope依赖范围
依赖范围 | 编译有效 | 测试有效 | 运行时有效 | 打包有效 | 例子 |
---|---|---|---|---|---|
Complie | √ | √ | √ | √ | spring-core |
provided | √ | √ | × | × | servlet-api |
runtime | × | √ | √ | √ | JDBC驱动 |
test | × | √ | × | × | Junit |
system | √ | √ | × | × | 本地maven仓库 之外的类库 |
依赖冲突
冲突产生的原因
上图中a jar包通过b和d间接依赖到的c jar包版本不一致,出现了冲突
依赖关系 | 实例 |
---|---|
直接依赖 | a和b的依赖关系 |
间接依赖 | a和c的依赖关系 |
比如:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
依赖冲突解决
1.第一优先声明原则
先定义的先使用
2.路径就近原则
直接声明使用
3.排除依赖
排除掉两个冲突中的一个,那么另一个就自然使用了
4.版本依赖
创建jar类型项目
创建Maven project
file--->new maven project-->将create a simple project选项打上对勾--->next--->书写坐标--->选择jar 类型
坐标:就是该项目在Maven中的唯一标识
Group id:一般为域名倒写
作用:项目上传Maven时,GroupID会作为本地仓库中的项目的存储路径
Artifact id:项目名:
作用:在eclipse中显示的项目名
上传Maven库的jar包的名字
version:当前项目的版本号
作用:
用来区分同一个项目的不同的版本。
Group id和Artifact id和version三个就可以唯一标识一个Maven项目,这三个数据就是所谓的坐标。
packaging:
jar:类似以前的java项目
pom:模块管理
war:类似以前的web项目
注意:
只是在项目物理视图上src目录下帮我们创建的了main/java子目录,但是在
编译好的代码结构中是没有main目录的,还是和以前一样src下直接是我们自己写的代码和配置文件。
配置依赖关系
配置本地项目依赖:
使用dependenies标签的子标签dependency配置,一个dependcy可以配置一个 坐标依赖
可以配置多个
注意:
在开发阶段,可以通过maven将没有打包的本地项目建立联系。
但是如果是上线阶段一定要打成包上传maven库中
命令:
mvn install--->将当前项目打包发布到maven库中,供其他人使用。
mvn clean-->清楚当前项目的maven垃圾文件
mvn update-->重新更新
如果安装失败:
mvn clean--->mvn update--->mvn install
注意:
一定是开发完成后再上传安装。
配置其他依赖:
使用dependenies标签的子标签dependency配置,一个dependcy可以配置一个坐标依赖
可以配置多个
war类型项目
maven的war类型项目:
作用:
类似我们之前的web project,主要用来开发web项目的。
特点:
需要放在服务器中运行。
创建:
file-->new maven project--->书写坐标-->选择war类型-->finish
注意:
在创建好项目后,项目会立即显示错误。因为没有web.xml文件。
需要给项目添加web.xml文件。在项目上右键--->javaEE tools--->GenerXXX
流程总结:
1、创建Mevan project
2、创建时选择packaging类型为war类型
3、在创建好的项目上右键选择添加web.xml文件
4、在项目的pom.xml文件中声明war项目的必要依赖
servlet依赖
jsp依赖
jstl依赖
其他依赖(SSM依赖,jackson依赖,上传下载依赖,数据库依赖,日志依赖,单元测试依赖)
5、在pom.xml中配置tomcat插件
本地发布插件
或者
服务器发布插件
6、选择项目右键run as-->maven bulid--->tomcat7:run
发布项目到tomcat插件,只需要发布一次。
必要的依赖:
在pom.xml中配置web项目的必要依赖
本地部署
本地发布:在开发阶段
在maven中发布,需要在maven中配置tomcat插件
1、插件配置示例:
<plugins>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 端口号 -->
<port>8082</port>
<!-- /表示访问路径 省略项目名 -->
<path>/</path>
<!-- 设置编码方式 -->
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
注意:
其实我们把项目发布到了Maven本地仓库中的tomcat中了
2、选择项目右键---->run as--->maven build--->书写相关信息
注意:
每个项目只需要构建一次,以后在eclipse的启动按钮中可以直接选择启动即可。
war项目的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.0</modelVersion>
<groupId>com.bjsxt.login</groupId>
<artifactId>demoLogin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 配置依赖 -->
<dependencies>
<!--配置web相关依赖 -->
<!--配置servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--配置jsp依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<!--配置jstl依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--配置SSM依赖 -->
<!--配置mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<!--配置log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!--配置cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<!--配置Spring和mybatis整合依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!--配置Spring依赖 -->
<!--配置mvc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--配置Spring的jdbc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--配置aspectjweaver的依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.6</version>
</dependency>
<!--配置mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
<!--配置jackson依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.6</version>
</dependency>
<!--配置上传下载依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--配置其他依赖 -->
<!--配置junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 配置插件 -->
<build>
<plugins>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 端口号 -->
<port>80</port>
<!-- /表示访问路径 省略项目名 -->
<path>/</path>
<!-- 设置编码方式 -->
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Maven项目继承
Maven的项目继承:
当前Maven项目的关系:
依赖关系
问题:
如果A项目使用N个jar的依赖,只需要在pom.xml中配置即可
如果B项目内使用和A相同的N个jar的依赖,需要在B的pom.xml中再次配置相同的依赖
如果C项目....
....
相同的依赖关系会多次配置。
如果项目需要修改依赖的jar的版本的话,所有的项目都要改
方案:
创建一个父项目,在父项目中将公共的依赖配置好,子项目继承父项目的依赖关系。
这样在子项目中,只需要配置自己的依赖关系即可。
实现:
使用Maven的项目继承。
作用:
便于项目管理
特点:
子项目之间是相互独立的。
1.创建Maven project 项目类型为pom类型
2、创建父项目的子项目
3、在父项目的pom.xml文件中配置公共依赖
方式一:
在父项目中使用dependencies标签直接配置依赖。
使用子标签dependency配置依赖
注意:
此种方式配置的依赖,所有子项目,默认全部继承,并
在项目中直接导入相关jar
方式二:
在父项目中使用dependencyManagement声明可以自定义继承的依赖关系
示例:i-parent
<dependencyManagement>
<dependencies>
<!--log4j依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--cglib依赖 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
在子项目中声明父项目的继承的依赖,但是不需要声明版本号
示例:i-child
<dependencies>
<!--自己的依赖 -->
<!--继承的依赖:不需要声明版本号 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
4、在父项目的pom.xml文件中,提取版本号统一管理:
示例:
提取:
<properties>
<log4j.version>1.2.11</log4j.version>
<servlet.version>4.0.1</servlet.version>
</properties>
应用:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
聚合工程
Maven的项目聚合关系:
Maven项目的关系:
依赖关系
继承关系
聚合关系
问题:
在真实开发过程中,在目前的知识下就算使用maven管理项目,依然存在
以下问题:
1、如果我们把所有的功能代码全部声明在一个Maven项目中
项目整体编译效率太低。影响开发效率。
2、所有的代码全部声明在一个项目中,不同的模块儿之间
的代码的视图的耦合性过高。不易于分模块儿开发
3、Maven依赖关系中,如果项目A只需要使用项目B的某部分功能
但是需要在A中将B整体依赖过来。
解决:
将项目拆分,分别进行打包上传Maven库中。
方案:
方案一:汽车租赁系统--->业务项目--->继承关系
将SSM项目拆分为四个Maven project
Controller层--->war类型---->A
service层------>jar类型------>B
mapper层----->jar类型------>C
pojo层-------->jar类型-------->D
以前我们将所有的代码声明在一个Maven project中,
现在我们向代码声明在四个Maven project中,最后将四个
Maven project中的代码通过依赖关系合并到一起即可。
方案二:汽车租赁系统--->业务项目----->聚合关系
将SSM项目拆分为四个Maven project
Controller层--->war类型---->A
service层------>jar类型------>B
mapper层----->jar类型------>C
pojo层-------->jar类型-------->D
四个Maven project只是在视图上的显示是四个项目的效果,但是
在工作空间的源码里看到的其实还是一个项目,使用maven的聚合关系。
聚合和继承的区别:
继承关系:
A,B,C,D四个项目是相互独立的项目。
聚合:
A,B,C,D只是在视图显示为四个项目的视图,但是本质是一个项目。
实现:
使用Maven的聚合关系
使用
Maven的聚合关系的使用
1、创建一个Maven project 类型为pom
2、创建子项目 ,Maven module,创建时声明父项目为pom类型的项目即可
file--->new--->Maven module
3、在pom类型的父项目中配置公共依赖关系
配置自定义依赖-->dependencyManager标签来配置SSM相关依赖
配置版本好的统一管理---->properties标签来配置
4、在子项目,也就是Maven module项目中书写模块儿开发代码,并在其pom.xml文件中自定义从父项目继承的依赖
5、在父项目上右键--->run as--->maven install,将子项目分别打包上传到maven库中
6、将war项目发布到tomcat服务器中即可。
拆分
Maven拆分SSM项目总结:
1、创建父项目,并在父项目中配置pom.xml依赖及其版本管理,以及插件管理
2、分别将SSM项目的以包为级别进拆分为子Maven module项目
controller层--->Springmvc的依赖和service的依赖
配置web.xml和applicationcontext.xml和springMVC.xml
service层---->SpringIOC和AOP和TX依赖以及mapper依赖
mapper层--->配置mybatis相关依赖和pojo依赖
pojo层--->没有依
3、选择父项目进行统一安装-->maven intaller
4、选择war类型的子项目进行服务器上传.