重识maven

 在之前直接使用了maven,了解了maven的最基本的使用,但是一直没有对maven做一个全面的了解,只知道maven是用来导jar包的,今天对maven做一个重新认识,方便后面理解springboot:

1.maven的父子工程:创建一个maven父工程

创建成功后删除src文件夹,因为父工程只负责管理jar包

1.1.父工程并没有实质性的内容,所有的jar包都在里面,也就是说只需要管理jar包即可,不参与任何逻辑开法

然后再父工程的pom文件中导入依赖:

<dependencies>
        <!--mysql包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
        <!--spring包-->
        <!--mybatis包-->
        <!--shiro包-->
    </dependencies>

在以往的项目中我们都是这么导入依赖的,现在导入依赖后,在父工程下创建子模块

创建好子工程后,在回过头查看父工程的pom文件:

可以看到,刚创建的子模块都在父工程的pom文件中显示出来了,在子工程的pom文件中也有这样一段代码

标识该模块的父工程,那么父工程是用来管理依赖的,因此父工程内有的依赖,子工程就会继承该依赖,因此就会在每一个子工程中都导入一遍父工程的依赖,

2.在父工程中拥有很多子模块,每一个子模块都代表了不用的包(package:entity,mapper,service,impl,controller)

  而且父工程中的所有jar包,都会被子工程所继承

问题1:

如果依赖非常多的话,就会影响项目的性能,因为每个模块负责的功能都不相同,如果web模块需要shiro的jar包,而其他的模块都不需要该jar包,但是因为父子工程的规则,强制子模块将jar包都导入进来,每一个子模块都都导入进来,就会影响项目于的性能运行速度等。怎么解决?

<!--dependencyManagement标签,被该标签控制的jar包不会被子工程所继承,如果子工程有需要,可以重写父工程中的jar包
    并且不需要写版本号(如果写了版本号,就表示是从maven重新下载,而不是继承父类工程的)-->
    <dependencyManagement></dependencyManagement>

具体实例如下:

<dependencyManagement>
        <dependencies>
            <!--mysql包-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.45</version>
            </dependency>
            <!--spring包-->
            <!--mybatis包-->
            <!--shiro包-->
        </dependencies>
    </dependencyManagement>

现在在父工程中,将jar包放入了dependencyManagement标签中,那么子模块就不能从父类中继承了,如果子工程需要用

不用写版本号,继承自父类。

使用maven的好处:

  方便了整个项目的管理,解决了jar包冗余的问题,方便分布式开发

问题2:

如果开始分模块开发,那么之前我们项目中写的entity、controler、mapper、service等包都会被分成一个一个的模块,这时候,controller要调用service,service要调用mapper,可是不在一个模块中,如图:

 仙子啊mapper中的UserMapper类内存在方法需要调用User实体:

User实体是在另一个model中的,调不到怎么解决?

使用工程依赖
在mapper项目中的pom.xml文件中以jar包的形式引入model项目即可
一旦使用量的工程依赖,就会出现层级依赖

在mapper模块的pom文件中引入model:

     <dependency>
            <!--groupId与父工程的一样-->
            <groupId>com.zs</groupId>
            <!--需要引入的模块-->
            <artifactId>model</artifactId>
            <!--需要引入的版本号-->
            <version>1.0-SNAPSHOT</version>
        </dependency>

然后就可以在mapper中引入User对象了:

问题3:

使用了层级依赖,上级所引用的jar包,下级是否可以引用?

 可以引用,在mapper中引用了model,在service中可以直接引用不需要重新导入依赖:

在service模块中引入mapper依赖:

这里并没有引入model的依赖;然后写接口:

注意,在这里仍然可以使用model的依赖,因为service引入了mapper,而mapper引入了model,因此service也可以使用model中的类。

定义实体类的标准:
1.需要实现序列化接口
2.需要重写hashCode和equalse
3.需要重写toString()
4.必须有getter和setter方法
5.要求所有的类型全部为包装类型,不能使用基本类型(因为使用包装类型可以防止空指针异常)

 

posted @ 2019-08-15 20:19  Zs夏至  阅读(175)  评论(0编辑  收藏  举报