IDEA MAVEN项目多个module,使用tomcat热部署

1、背景

          项目使用maven多模块构建,线上使用tomcat发布。一个模块为maven web项目,其余均为非web。发布时其余几个模块作为web模块的依赖引入,一起打包发布。

2、问题

        使用idea+tomcat进行开发,实现热部署功能。tomcat发布过程中可选择war 和 war exploded两种模式。开发环境使用war exploded实现热部署。

问题1:研发环境只有web模块一个war exploded包可选,配置好tomcat启动后查看发布包里面内容依赖的几个子模块的class及配置文件均未打包进去进行发布。

问题2:线上环境使用war打包,在idea命令行窗口构建完成后,生成的war包将子模块以jar包的形式放到lib中进行发布。会造成子模块中的bean无法初始化,且不好进行增量抽取上线。

3、解决办法

针对问题1:

在idea的tomcat配置发布选项页中选择对应的war exploded包后,选择状态下点击编辑按钮。如下图红色按钮所示,在编辑窗口中选择图2中1处的classes,会显示当前web模块(3标识,其余为添加后的内容)的编译输出,全部模块在右侧区域显示。点击添加(2标识),弹出的图3所示内容选择Module Output,选中其他需要加入的module即可。

                                                                                     图1

                                                                                                  图2

                           

                                                                                                   图3

针对问题2:

使用maven-dependency-plugin插件,对依赖子module在构建时进行unpack将jar包内容输出到指定目录即可。实现方式为在web module的pom.xml中新增如下配置。其中groupId,artifactId,version按照依赖的子module实际名称配置即可。outputDirectory指定解包的目录;includes指定需要输出到outputDirectory中的文件类型。其他配置及使用可自行查阅官方教程--》maven-dependency-plugin插件使用

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>X.Y</groupId>
                        <artifactId>aaa-bbb</artifactId>
                        <version>${project.version}</version>                         <type>jar</type>                         <overWrite>true</overWrite>                         <outputDirectory>.\target\classes</outputDirectory>                         <includes>**/*.class,**/*.xml,**/*.properties,**/*.txt</includes>                     </artifactItem>                        </artifactItems>             </configuration>         </execution>     </executions> </plugin>