现在的工程结构能满足你的需求吗?

创建单模块工程相信很多人都手到擒来。但如果项目很大,功能很多,你还能继续使用单模块工程吗?项目过大,结构肯定也越来越复杂这时候如果你继续使用单模块工程,进展就会遇到各种问题。同时维护起来也是很麻烦的事情。这个时候你就可以考虑将功能细化,使用多模块工程来替代单模块了。

一、使用maven多模块工程的好处

  1. 复杂项目拆分成多个模块多模块的划分可以降低代码之间的耦合性,方便维护。
  2. 多模块可以根据工程拆分,也可以根据菜单拆分,具体可根据公司要求。结构拆分清晰了,那么公司团队中每个人负责的代码模块也就清晰了。不会出现两个人改了同一段代码,如果功能出现问题责任追踪也很方便。
  3. 方便代码的重用。如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。比如app-util,就可以作为成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
  4. 解决了包的问题。maven将包的依+赖关系定义在了pom.xml中,所有jar包放在.m2里。这样的话,我们首先不会出现包冲突的问题,其次,解决了我们去找包、去包的问题。
  5. 5.方便、快捷。一键重新编译、一键清理编译代码、一键打包等。总之怎么方便怎么来哇。

二、如何创建maven多模块项目

我们可以粗略的将java代码做Dao、Service和Controller三层划分。

Controller层可以用于:请求转发(route)、视图渲染(view render)。

业务逻辑的实现最终会放到Service和Dao层。

1.创建工程

1.1点击FIle >> New >>Project >>maven

点击Next根据要求选择路径,填写项目名称,一路傻瓜式的Next。

1.2建立好工程之后,删除src文件只保留pom文件

1.3 然后点击File >> New >> module 创建其他模块,此时pom文件会发生变化

创建主项目工程-Web工程,该工程为web工程,并打war包,创建方式也不再是maven。

步骤:父工程右键 >> new Module >> Spring Initializer。

选择需要的模块(这里添加web):

1.4创建好的项目结构如下:

1.5在最外层pom引入SpringBoot依赖

pom.xml依赖:

  <?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>
    <groupId>blm.server</groupId>
    <artifactId>multi-boluome</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>web</module>
        <module>service</module>
        <module>dao</module>
        <module>domain</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <kotlin.version>1.0.6</kotlin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--引入mock框架-->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.10.19</version>
        </dependency>
        <!--rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>
    </dependencies>

    <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>iflyer.IflyerApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
                        </goals>
                        <!--可以生成不含依赖包的不可执行Jar包-->
                        <!-- configuration>
                          <classifier>exec</classifier>
                        </configuration> -->
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2.为每个层添加依赖

dao层依赖domain,service依赖dao和domain,web层依赖service、dao、domain

2.1点击File --> Project Structure 打开

2.2依次添加依赖,点击右侧的+号 >> Module Dependency

添加每个层所需要的依赖

2.3dao层依赖

2.4 Service层依赖

2.5 web层依赖

2.6 domain层依赖

到这里工程就搭建好了。构建模块其实不难,如何把它打包成一个执行jar才是难点。

三、如何打包成一个执行jar包。

3.1 在启动类中修改pom文件(也就是web层的)

<build>
    <!-- 为jar包取名 -->
    <finalName>blm-start</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.3.0.RELEASE</version>
        </plugin>
    </plugins>
</build>

3.2 在外层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>com.Application</mainClass>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
                    </goals>
                    <!--可以生成不含依赖包的不可执行Jar包-->
                    <!-- configuration>
                      <classifier>exec</classifier>
                    </configuration> -->
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

本文分享自微信公众号 - Java后端技术栈(t-j20120622)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券