zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Maven 父子工程的一些细节

Maven 一些 工程 细节 父子
2023-09-11 14:14:35 时间

 

Project,项目,也叫做工程。

 

父子工程中,子模块会自动继承父工程的资源、依赖,但子模块之间是独立的,不能直接访问彼此中的资源、类。

就是说我们可以把多个子模块都要用的资源、依赖提出来,放到父工程中,注意微服务的每个服务都是独立的,不能这么干。

 


 

父子工程的依赖继承问题

子模块会继承父工程的依赖,但并不是所有继承下来的依赖都有效、还能在子模块中使用。

作用域是provided、test的依赖,继承下来都是无效的,需要在子模块的pom.xml中重新导入。

 


 

 

使用其它子模块中的类

有时候我们要使用本项目其它子模块中的类,或者使用其它项目的某个模块中的类。

常见的情况是:把某个模块打包为jar,安装到公司私服,供公司内部使用。

 

不能直接使用其它子模块中的类,需要先把要使用的子模块打包为jar,安装到仓库,然后在要用的子模块的pom.xml中引入依赖。

比如我要在service子模块中使用dao子模块:

 

(1)对dao子模块中的install双击,打包为jar,安装到仓库

 

 

(2)在service子模块的pom.xml中导入依赖:

     <dependency>
            <groupId>org.example</groupId>
            <artifactId>dao</artifactId>
            <version>1.0</version>
        </dependency>

对应dao模块的公司|组织名、模块名、版本号。

 

 


 

 

父子工程的2种启动方式

(1)通过Maven的tomcat插件启动

在父工程的pom.xml中添加tomcat插件

    <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <!--配置tomcat的端口号、将工程映射到哪个路径(域名后面的工程名)、uri编码字符集-->
          <configuration>
            <port>8080</port>
            <path>/ssm</path>
            <uriEncoding>UTF-8</uriEncoding>
          </configuration>
        </plugin>

 

 

tomcat插件启动方式一:

 如果没有出现tomcat7,刷新一下、重新导入。

 

 

tomcat插件启动方式二:

 

 

说明

  • 这2种方式都是通过Maven的tomcat插件来启动,都需要在父工程的pom.xml中配置tomcat插件。
  • 其实真正部署到tomcat上的是web模块,所以也可以在web模块的pom.xml中配置tomcat插件,启动该web模块。
  • 如果要引用其他模块中的类,都需要先install安装到本地仓库或私服,然后在pom.xml中添加该模块的依赖。

 

 

 

(2)使用外置的tomcat来启动

无需在pom.xml中配置tomcat插件。

 

 


 

 

jar包锁定

公司往往要在父工程的pom.xml中统一项目的jar包版本,但如果在子模块的pom.xml中导入了同名、不同版本的jar包,会覆盖父工程传递的同名依赖。

为防止这种问题,需要在父工程的pom.xml中锁定jar包版本。

  <!--jar包锁定-->
  <dependencyManagement>
    <dependencies>
      <dependency></dependency>
      <dependency></dependency>
      <dependency></dependency>
    </dependencies>
  </dependencyManagement>

  <!--依赖-->
  <dependencies>
    <dependency></dependency>
    <dependency></dependency>
    <dependency></dependency>
  </dependencies>

就是把<dependencies>拷贝一下放到<dependencyManagement>中。锁定之后,如果子模块中出现同名的依赖,以父工程传递的依赖(锁定的依赖)为准。

需要注意的是<dependencyManagement>只有锁定jar包的功能,不会导入jar包。

 

 


 

 

统一管理jar包版本

  <!--统一管理jar包版本-->
  <properties>
    <!--元素名即key,随意取但尽量见名知义,通过${key}来引用-->
    <mybatis.version>3.5.4</mybatis.version>
  </properties>

  <!--jar包锁定-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <!--依赖-->
  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
  </dependencies>

 

把版本都写在<properties>中,使用${ }引用即可,这样维护起来方便。