Maven多模块项目

2,317 阅读5分钟

多模块

随着公司业务的增多,相应的代码增多,单机到多机,到微服务,集群逐渐演变;这时代码的良好管理和规划变得更加重要;

为了提高效率,根据业务的不同将揉作一团的业务代码分离出来,业务划分上分割清晰,提高代码复用率,技术转型非常重要;

实施落到实处最后就是代码这一层级的变动,可以采用多项目模式和多模块模式;

  • 多项目:每个业务单独新建项目并编写相应逻辑
  • 多模块:业务聚合在一个项目中的不同模块中,然后通过依赖调用实现业务逻辑

实施

文章中采用开发工具Idea;

第一步:(构建parent父模块)

新建Maven项目,保留pom.xml文件,src目录删除;

第二步:(构建子模块)

新建模块1,在parent父模块中增加子模块声明,便于其他子模块引用;

新建模块2,重复上面步骤;

第三步:(配置打包规则)

parent父模块中可以进行版本依赖管理(全局管理),子模块声明,远程仓库发布配置; parent父模块pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!-- parent必须使用pom格式打包并上传到仓库 -->
  <packaging>pom</packaging>
  <parent>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.9.RELEASE</version>
  </parent>
  <modules>
    <module>pax-bff-model</module>
    <module>pax-bff-web</module>
    <module>pax-bff-core</module>
  </modules>
  <groupId>cn.dfd.mars.paxbff</groupId>
  <artifactId>pax-bff-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>

<!-- 全局版本管理 -->
  <properties>
    <pax-bff.version>0.0.1-SNAPSHOT</pax-bff.version>
    <mapper-spring-boot-starter.version>1.1.3</mapper-spring-boot-starter.version>
    <swagger.version>2.9.2</swagger.version>
    <message.version>0.0.16</message.version>
    <fastjson.version>1.2.62</fastjson.version>
    <jackson-databind.version>2.9.9.3</jackson-databind.version>
    <spring-cloud.version>2.1.4.RELEASE</spring-cloud.version>
  </properties>

    <!-- 依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>cn.dfd.mars.paxbff</groupId>
        <artifactId>pax-bff-model</artifactId>
        <version>${pax-bff.version}</version>
      </dependency>
      <dependency>
        <groupId>cn.dfd.mars.paxbff</groupId>
        <artifactId>pax-bff-core</artifactId>
        <version>${pax-bff.version}</version>
      </dependency>
      <!--通用mapper-->
      <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>${mapper-spring-boot-starter.version}</version>
      </dependency>
      <!--token-->
      <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.8.3</version>
      </dependency>
      <!--swagger-->
      <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
      <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
      </dependency>
      <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
      </dependency>
     

      <!--feign-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>${spring-cloud.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>${spring-cloud.version}</version>
      </dependency>

      <!--序列化-->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-databind.version}</version>
      </dependency>

    </dependencies>
  </dependencyManagement>

    <!-- parent父模块pom文件上传到远程仓库 -->
  <distributionManagement>
    <repository>
      <id>maven-public</id>
      <name>snapshot</name>
      <url>http://xxx/ssss/</url>
    </repository>
  </distributionManagement>

</project>

子模块直接引入其他子模块,对外暴露的子模块需要发布处理配置(如下);

子模块1:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>pax-bff-parent</artifactId>
    <groupId>cn.skio.mars.paxbff</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>pax-bff-model</artifactId>
  <!-- 子模块打包方式为jar,统一,看公司打包方式,现在基本都是jar -->
  <packaging>jar</packaging>
  <!--  子模块不需要部署到仓库  -->
  <properties>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>

  <dependencies>
    <!--数据库映射主键-->
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
    <!--swagger-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <scope>provided</scope>
    </dependency>
    <!--序列化-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <scope>provided</scope>
    </dependency>
  </dependencies>

</project>

对外暴露子模块:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>pax-bff-parent</artifactId>
    <groupId>cn.dfd.mars.paxbff</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>pax-bff-web</artifactId>
  <!-- 真正要发布的是此模块,所以不上传到仓库 -->
  <properties>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>

  <dependencies>
  <!-- 子模块依赖 -->
    <dependency>
      <groupId>cn.dfd.mars.paxbff</groupId>
      <artifactId>pax-bff-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
    <!--swagger-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
  </dependencies>


  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <!-- 跳过测试,工期比较近,测试略过 -->
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

以上就是Maven多模块项目创建,发布,打包的全过程,有问题欢迎留言;