maven模块化项目踩坑之行

微服务实践之行

使用maven进行项目模块拆分,遇到的一些坑,微服务框架层使用springboot。
使用user-server为例

一、服务分析
. 用户模块服务包含了对用户信息的一系列操作,如登陆校验, 修改/增加用户等行为。因此涉及到了暴露给网关调用的接口层, 数据库连接层dao, 以及具体的业务逻辑层。

二、拆分
. 将该模块拆分为四个子模块, 分别对应的core, remote, dao, service.

  • core: 包含的有springboot启动类以及一些配置类(数据库配置或组件扫描注册等)。
  • remote: 包含的有接口和实现类,供网关进行远程调用。实现类中调用了业务层的接口。
  • dao: 包含model, 数据库操作以及mybatis的xml文件
  • service: 包含接口和实现类。具体的进行业务操作。

三、 pom配置

根据场景需要分为项目根配置文件, 主要作用是依赖一些公共第三方的jar包以及使用<modules>将core, remote, dao, service四个模块管理起来。

  • 根pom配置关键代码块如下:
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>user-server</name>

<modules>
    <module>user-server-core</module>
    <module>user-server-remote</module>
    <module>user-server-dao</module>
    <module>user-server-service</module>
</modules>
  • core模块配置关键代码块如下:
<artifactId>user-server-core</artifactId>
<packaging>jar</packaging>
<name>user-server-core</name>

<parent>
    <groupId>cn.beardream</groupId>
    <artifactId>user-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
        <!-- 需要扫描到的组件 -->
        <dependency>
            <groupId>cn.beardream</groupId>
            <artifactId>user-server-remote</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.beardream</groupId>
            <artifactId>user-server-service</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.beardream</groupId>
            <artifactId>user-server-dao</artifactId>
            <version>${project.version}</version>
        </dependency>
</dependencies>
  • remote模块关键配置
    <artifactId>user-server-remote</artifactId>
    <packaging>jar</packaging>
    <name>user-server-remote</name>

    <parent>
        <groupId>cn.beardream</groupId>
        <artifactId>user-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>cn.beardream</groupId>
            <artifactId>user-server-service</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
  • dao模块关键配置
    <artifactId>user-server-dao</artifactId>
    <packaging>jar</packaging>
    <name>user-server-dao</name>
    <parent>
        <groupId>cn.beardream</groupId>
        <artifactId>user-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
  • service模块关键配置
    <artifactId>user-server-service</artifactId>
    <packaging>jar</packaging>
    <name>user-server-service</name>
    <parent>
        <groupId>cn.beardream</groupId>
        <artifactId>user-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>cn.beardream</groupId>
            <artifactId>user-server-dao</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

由maven配置可以看的出来, 四个子模块的parent都是user-server, user-server的pom配置modules包含了他们四个子模块。子模块中如果需要用到其他模块的只需要用dependency依赖进来即可。

四、如何将多个模块打成一个可执行jar包呢?

在前面我们构建了四个子模块以及一个父pom文件,但父pom文件的packaging其实是pom类型的,因此不能打包;正确的打包方式应该在springApplication所在项目中的pom文件加上spring-boot-maven-plugin这个插件,并且在父pom文件上进行配置。

  • springApplication启动类所在模块pom
    <build>
        <finalName>user-server-core</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.3.0.RELEASE</version>
            </plugin>
        </plugins>
    </build>
  • 父pom文件中配置
    <build>
        <plugins>
            <plugin>
                <!-- The plugin rewrites your manifest -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.3.0.RELEASE</version>
                <configuration><!-- 指定该Main Class为全局的唯一入口 -->
                    <mainClass>cn.beardream.userserver.UserServerApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
                        </goals>
                        <!--可以生成不含依赖包的不可执行Jar包-->
                        <!-- configuration>
                          <classifier>exec</classifier>
                        </configuration> -->
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

至此

我们的微服务模块划分打包就已经完成啦~

ps: package选择pom和jar的不同情况:在该pom文件为一个需要被依赖的父pom文件时要选择pom的打包方式,但具体的项目要选择jar包的打包方式。

项目打包参考了该博客:http://blog.csdn.net/message_lx/article/details/54632947

    原文作者:梦袋熊先生
    原文地址: https://www.jianshu.com/p/dcd331d987bb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞