一:jar包冲突
maven工程要导入jar包的坐标,就必须要消除jar包冲突的问题
解决jar包冲突的方式一:
第一声明优先原则。哪个jar包坐标在靠上的位置,哪个jar包就是先声明。的先声明的jar包坐标依赖下的包就先进入项目
maven导入jar包一些概念
直接依赖:项目中直接导入的jar包就是该项目的直接依赖包
传递依赖:项目中没有直接导入的jar包可以通过项目直接依赖jar包传递到项目中
解决jar包冲突的方式二:
路径近者优先原则:直接依赖路径比传递依赖路径近,那会最终项目进入的jar包就是路径近的直接依赖包。
解决jar包冲突的方式三:
直接排除法:(推荐使用这一种)
放我们要排除某个jar包下的依赖包,在配置exclusions标签的时候内部可以不写版本号,此时依赖包使用的版本默认和本jar包一致
二、maven工程是分父子依赖关系的
凡是依赖别的项目后,拿到的别的项目的依赖包都属于传递依赖。
比如当前A项目,别B项目依赖,那么我们A项目中的所有jar包都会被传递到B项目中
B项目开发者如果在B项目中导入一套ssm框架的jar包,这对于B项目是直接依赖的。
那么直接依赖的jar包就会把A传递过来的jar包给覆盖掉。为了防止以上情况出现 我们可以把A项目的主要jar包的坐标锁住,
这样其他依赖该项目的项目中,即使有同名jar包直接依赖,也无法覆盖。
<dependencyManagement>
maven聚合思想解析
三、 子父工程
1.父工程只需要一个pom.xml文件即可 其他的src 文件可以删除!!!
首先需要先建造父工程 用不用骨架都可以 , 可以不需要骨架。还是要用maven形式,
新建一个project 也可以新建一个Model,然后选择maven 不用骨架下一步 命名可以maven_parent 然后创建成功
然后在点住父工程 右键model 子模块
直接创建一个dao的模块,maven_dao 即可 不需要骨架 web模式
<parent> <artifactId>maven_parent</artifactId> <groupId>com.ujy</groupId> <version>1.0-SNAPSHOT</version> </parent>
<!--子模块和父模块公用 版本号,域名, 但是项目名需要有自己的--> <modelVersion>4.0.0</modelVersion> <artifactId>maven_dao</artifactId>
接下来依次创建 service的 不需要骨架
<parent> <artifactId>maven_parent</artifactId> <groupId>com.ujy</groupId> <version>1.0-SNAPSHOT</version> </parent>
<!--子模块和父模块公用 版本号,域名, 但是项目名需要有自己的--> <modelVersion>4.0.0</modelVersion> <artifactId>maven_service</artifactId>
再创建web ,因为要与页面交互,所有选择web模式,加上骨架,
<parent> <artifactId>maven_parent</artifactId> <groupId>com.ujy</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <!--子模块和父模块公用 版本号,域名, 但是项目名需要有自己的--> <artifactId>maven_web</artifactId> <packaging>war</packaging>
这样三个子模块就创建好了 注意:模块几个都可以 。
注意:工程和模块的区别
1.工程不等于完整的项目,模块也不等于完整的项目
一个完整的项目看的是代码,代码完整就可以说是一个完整的项目,这和这个项目是工程 或者是模块没有区别。
工程:工程天生只能使用自己的内部资源 直接依赖的 传递依赖过来的 也可以使用,天生是独立的,后天可以和其他工程或者模块建立关联关系
模块:模块天生不是独立的,天生属于父工程,模块一旦创建,所有父工程的资源模块都可以使用
父子工程关系:子模块天生继承父工程,可以使用父工程所有资源
子模块天生没有任何关系 ,后天可以引入其他模块的坐标建立关系
<!--service模块引用dao模块--> <dependencies> <dependency> <groupId>com.ujy</groupId> <artifactId>maven_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> //分割线。。。。。。 <!--web模块引用service模块--> <dependencies> <dependency> <groupId>com.ujy</groupId> <artifactId>maven_service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> 这样这三个模块 三层架构就建立关系 就可以称一个完整的项目
父子工程之间不用建立关系,继承关系是天生的的 不需要建立关系。
平级之间的引用是依赖 ,依赖不是天生的 是后天建立的 。
子模块如果需要引用其他项目的比如dao资源 也可以 引入坐标 ,前提是其他的这个项目的这个dao需要先打成包,扔到本地仓路才可以
传递依赖下的包能否使用:
这个图片了解即可 ,导不进去 就重新导一次 。
然后就是开始填充内容
先填充maven_dao的内容
只填充dao层的内容 架构和先搭建起来 和之前一样。然后配置文件就导入和dao相关的。
然后填充service层的东西
中间那个tx事务层的配置文件 需要导入一下applicationContext-dao的配置文件
<import resource="classpath:applicationContext-dao.xml"/>
这个是service的配置文件 导入dao的配置文件 。
然后填充web层的东西
web层 也需要更新一下web.xml文件 把之前的web.xml里面的三大器件配置文件拷贝下来。 然后把一些前端用到的 jsp的页面也拷贝下来。
以为web.xml文件里面扫描有一个监听器applicationContext*.xml所以需要再创建一个applicationContext.xml
然后里面导入service的配置文件
<import resource="classpath:/applicationContext-service.xml"/> <import resource="classpath:/applicationContext-tx.xml"/>
然后这就是填充好了
接下来就是启动项目以及模块
启动也分三种方式:
第一种直接找到父工程的tomcatrun 启动 。
启动一个maven工程永远先从本地仓库找jar包,找就找pom中添写的jar包的坐标, 里面添加了service,daojar包
但是本地仓库没有 ,就去联网从中央仓库找,但是这几个中央仓库根本就不会收藏,所以找不到 ,需要把service,dao等 打包到本地仓库。
但是启动父工程依赖的jiar包 中央仓库会有 所以第一种启动方式不会报错。。所以第二种启动方式需要先把service,dao等jar包打包到本地仓库。
这就是打包到本地仓库的方式。
接下来第三种启动方式:
就是配置一下tomcat插件启动 ,
前两种都不需要配置tomcat 然后到此结束!!!!!!!!!!!!!!!!!