maven第二阶段

Maven

Maven的拆分与聚合

一个完整的早期开发好的crm项目,现在要使用maven工程对它进行拆分,这时候就可以将dao拆解出来形成表现独立的工程,同样service,action也都这样拆分

  • 工程拆分之后,将来还要聚合(聚合就是将拆分的工程进一步组合在一起,又形成一个完整的项目)
  • 为了达到聚合的目标,所以今天会引入
    • 父工程(maven project)
    • 子模块(maven module) dao ,service, web


开发步骤:

  1. 创建一个maven父工程


    创建后的父工程如下:

    从它的目录结构可以看出,父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了
  2. 创建这个父工程的子工程

    点击next,进入下图:

    点击next:
  3. 再次查看父工程的pom.xml工程
  4. 查看子模块的pom.xml,发现多了一个parent结点

    并且内部所包含的结点,其实就是父工程的坐标
    1
    2
    坐标=groupId+artifactId+version
            组织名   项目名       版本

冲突问题的解决

通过添加<exclusion>标签来解决冲突

  • 在父工程中引入了struts-core,hibernate-core,就发现jar包是有冲突的
    • Javassist存在版本上冲突问题,一个高版本一个低版本
  • 解决:去除struts2中的javassist,就要在struts依赖中右键


    进入下图

    会在工程中添加:

依赖调解原则

maven自动按照下边的原则调解:

  1. 第一声明者优先原则
    在pom文件定义依赖,先声明的依赖为准
    struts-spring-pluginsspring-context中都有spring-beans,前者是4.2.4版本比较高。
    • 测试:
      如果将struts-spring-plugins放在spring-context前面,系统将导入spring-beans-4.2.4
    • 分析:
      由于spring-context在前边以spring-context依赖的spring-beans-4.2.4为准,所以最终spring-beans-4.2.4添加到了工程中。
  2. 路径近者优先原则
    还是以上面为例子:如果手动引入一个spring-beans,则会导入手动引入的这个,因为这个不需要依赖其他的jar包而存在,找到的时候路劲最短。

使用版本锁定实现冲突解决

  • 首先父工程中pom.xml文件中添加<dependencyManagement>
  • 在父工程中锁定,他本身并不引入坐标,他会规定他所依赖的项目要引这个坐标时,会在锁定的版本前面有一个小锁,开发的时候就要选择锁定的那个版本。
  • 锁定之后父项目并没有引入这个坐标,这是锁定了而已
  • 然后哪个项目需要在引入

  • 在使用坐标时,对于同一个框架,引入多次时,它的版本信息就会多次出现,所以
  • 可以借用常量的思想,将这些版本号提取出来,在需要用到的时候,直接写版本的常量名称就可以了。
  • 引上面的常量

依赖关系

依赖具有传递性,但不是无限传递的,传递的规则如下:

解决方法:
如果在依赖传递过程中,导致jar包丢失,我们的做法很简单,就是再导入一次坐标

  • 依赖具有传递性: action依赖于service,如果在service中引入dao,那么在action中引入service的时候会把dao引入进来

  • 如果想把引入的jar包所依赖的jar包全部干掉就再上面解决冲突中的代码中<artifactId>*</artifactId> <groupId>*</groupId>加*即可

继续开发添加service跟dao

  1. 创建一个maven module项目
    创建结束后,父工程中结构如下:

    父工程的pom.xml文件如下:
  2. 在service的pom.xml文件中引入dao的jar包
  3. Web层的子模块创建:web层的packing就不是jar了

    web是要依赖service

配置文件的添加:

  • 整合applicationContext的时侯,因为每层要用到的配置不一样,所以可以把它分为三个配置文件最后在通过
    1
    2
    3
    <import resource="classpath:spring/applicationContext-dao.xml"/>
    <import resource="classpath:spring/applicationContext-service.xml"/>
    <import resource="classpath:spring/applicationContext-action.xml"/>

这种方式把三个配置文件整合到一起,放到web层下。

  • hibernate中的配置如下(有一些改进的地方):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="show_sql">true</property>
        <property name="format_sql">false</property>
        <!-- 自动建表以前是update但是不规范 -->
        <property name="hbm2ddl.auto">none</property>
        <!-- 懒加载,配合web.xml中配置的 openSessionInViewFilter -->
        <property name="hibernate.enable_lazy_load_no_trans">true</property>
        <!--校验模式  JPA  java persistent api-->
        <property name="javax.persistence.validation.mode">none</property>
        <mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  • 还需要注意,hibernate的映射文件要建好对应的包结构
    \src\main\resources\cn\itcast\domain
  • PO类(实体类的七个规范):
  1. 是一个共有类
  2. 提供私有的属性
  3. 提供共有的getter与setter
  4. 实现java.io.Serializable
  5. 提供一个无参的构造方法
  6. 不要使用final修饰
  7. 如果是基本数据类型,要使用它的包装类

私服搭建

下载nexus并安装

  1. 下载
    • Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。
    • 下载Nexus, 下载地址: http://www.sonatype.org/nexus/archived/
  2. 安装并运行:
    • 解压进入到指定的目录:nexu-2.12.0.01-bundle\nexus-2.12.0.-01\bin
    • 执行nexus.bat install
    • 安装成功就会在服务中新增一个nexus服务

卸载

进入到bin目录下执行:nexus.bat uninstall

启动

  • 启动:
    • 方法一:直接进入到bin目录中执行nexus.bat start
    • 方法二:直接进入到服务列表中启动

配置

  • 查看nexus的配置文件conf/nexus.properties
1
2
3
4
5
6
7
8
9
# Jetty section
application-port=8081      # nexus的访问端口配置
application-host=0.0.0.0     # nexus主机监听配置(不用修改)
nexus-webapp=${bundleBasedir}/nexus     # nexus工程目录
nexus-webapp-context-path=/nexus     # nexus的web访问路径
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus   # nexus仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF  # nexus运行程序目录
  • 访问: http://localhost:8081/nexus/

  • 登陆成功之后会有四种仓库类型:

    1. hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
    2. proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
    3. group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
    4. virtual(虚拟):兼容Maven1 版本的jar或者插件

    nexus仓库默认在目录中:


仓库的介绍:

  • central:代理仓库,代理中央仓库
  • apache-snapshots:代理仓库
    存储snapshots构件,代理地址https://repository.apache.org/snapshots/
  • central-m1:virtual类型仓库,兼容Maven1 版本的jar或者插件
  • releases:本地仓库,存储releases构件。
  • snapshots:本地仓库,存储snapshots构件。
  • third party:第三方仓库
  • public:仓库组

七个仓库对应着本地服务器的nexus-2.12.0-01-bundle/sonatype-work/nexus/storage

测试,上传到私服

使用install会把项目打包放到本地仓库中

  • 要想打包发到本地仓库跟私服你中就要执行以下步骤:

    1. 需要在客户端即部署dao工程的电脑上配置maven环境,并修改maven目录/conf/settings.xml 文件,配置连接私服的用户和密码 。
      此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码 是否和私服中的账号和密码一致。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <server>
        <id>releases</id>
        <username>admin</username>
        <password>admin123</password>
      </server>
      <server>
        <id>snapshots</id>
        <username>admin</username>
        <password>admin123</password>
      </server>
    2. 在pom.xml中加入一段配置:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
       <distributionManagement>
          <repository>
            <id>releases</id> 
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
          </repository>
          <snapshotRepository>
            <id>snapshots</id>
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
          </snapshotRepository>
        </distributionManagement>

    意思为:配置私服仓库的地址,本公司的自己的jar包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库

  • 现在就可以用deploy命令上传到私服中的snapshots

从私服上下载jar包

需求

没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找jar,如果没有找到则连接私服从私服下载jar包,如果私服没有jar包私服同时作为代理服务器从中央仓库下载jar包,这样做的好处是一方面由私服对公司项目的依赖jar包统一管理,一方面提高下载速度,项目连接私服下载jar包的速度要比项目连接中央仓库的速度快的多。

在setting.xml中配置仓库

当然得先保证:本地仓库中跟项目中没有需要的jar包,这里显示dao

  • 把下面的配置文件放到maven的setting配置文件的profile结点中,意思是告诉maven本地找不到去哪个私服找(注意如果是在别人的私服中找记得改ip)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <profile>
    <!--profile的id-->
     <id>dev</id>
      <repositories>
        <repository>
      <!--仓库id,repositories可以配置多个仓库,保证id不重复-->
          <id>nexus</id>
      <!--仓库地址,即nexus仓库组的地址-->
          <url>http://localhost:8081/nexus/content/groups/public/</url>
      <!--是否下载releases构件-->
          <releases>
            <enabled>true</enabled>
          </releases>
      <!--是否下载snapshots构件-->
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
          <pluginRepository>
            <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
              <id>public</id>
              <name>Public Repositories</name>
              <url>http://localhost:8081/nexus/content/groups/public/</url>  
          </pluginRepository>  
      </pluginRepositories>  
    </profile>
  • 找的时候会到public公共仓库中去找,因为,公共仓库中包含下面几个仓库,会依次寻找:

  • 为了使得这些配置生效需要在配置一下在profile结点下边配置一下:

    1
    2
    3
      <activeProfiles>
        <activeProfile>dev</activeProfile>
      </activeProfiles>
  • 现在在项目中把dao关掉,会报错,在update一下,就会去本地找,找不到再去私服中找,然后找到了先下载到本地仓库中然后就能够使用了就不会报错了

管理仓库组

  • nexus中包括很多仓库,hosted中存放的是企业自己发布的jar包及第三方公司的jar包,proxy中存放的是中央仓库的jar,为了方便从私服下载jar包可以将多个仓库组成一个仓库组,每个工程需要连接私服的仓库组下载jar包。

  • 打开nexus配置仓库组,如下图:

    上图中仓库组包括了本地仓库、代理仓库等。

张冲 wechat
欢迎扫一扫上面的微信关注我,一起交流!
坚持原创技术分享,您的支持将鼓励我继续创,点击打赏!