Maven

一: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   然后到此结束!!!!!!!!!!!!!!!!!

posted @ 2019-11-20 13:53  呆code  阅读(163)  评论(0编辑  收藏  举报