使用maven warpath插件合并多module的war包


现在java 项目一般使用maven、gradle等工具来管理jar包、打包、发布。如果一个项目有很多模块,那般是分成多个module,主目录有个parent,负责包含全部的module,然后目录中多个module文件夹,分别依赖parent或者其他module。最近有个项目,项目很久,代码全部放在一起,随着业务拓展变得与越来越庞大,于是其对进行module拆分。

问题

  1. 多个模块可能交叉依赖。
  2. 每个模块可能都会有前台页面的代码,jsp、js等。
  3. maven打包的时候能否war包、jar包一起打。

解决方式

  1. 交叉依赖必须解决,尽可能多的剥离独立代码,让它成为其他模块以来的包,这个包可以使用maven打成jar包。然后拆分其他的模块,可以有顺序依赖,但是不能交叉依赖。
  2. 多个模块都有前台代码,前台代码在maven打包是不需要编译,是直接copy到target目录,然后再打成war包。这样我们就可以把所有模块的前台代码都抽离出来,当成一个单独的module,如project-web模块,当然也可以不抽离,但是需要用到第三步。
  3. 使用maven插件可以做到war、jar一起打。插件名字是maven-jar-plugin。示例pom配置如下(在pom.xml开头中指定打包类型是war):
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                <execution>
                    <id>make-a-jar</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        </plugins>
    </build>
    

执行mvn install就可以得到war和jar包,默认是在target文件夹下。

介绍就这些,下面是示例的pom配置,首先parent中的pom.xml(注意parent的打包类型是pom):

        <groupId>com.yeetrack.project</groupId>
        <artifactId>project-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>My Maven Webapp</name>
        <modules>
           <module>common</module>
           <module>module-one</module>
           <module>module-two</module>
           <module>module-three</module>
     </modules>

在各个模块中配置parent项目(下面是module-one):

    <groupId>com.yeetrack.project</groupId>
        <artifactId>module-one</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>/* 如果此模块有前台代码,那就是war */
        <name>module-one</name>
        <parent>
             <groupId>com.yeetrack.project</groupId>
             <artifactId>project-parent</artifactId>
             <version>1.0-SNAPSHOT</version>
        </parent>

如果module two依赖module one,有两种情况:

  • module-one打jar包(此module没有前台代码)
    mvn install后,就可以将该模块打成jar包,然后安装到本地maven仓库,module-two就可以直接依赖,添加dependency即可。
  • module-two打war、jar同时打(此模块有前台代码)
    同时打war、jar方法,去看上面的第三步,打出war、jar包后。maven将module-one的war包安装到本地仓库,将jar包放在它的target文件夹中。这样module需要依赖jar包,也需要war包(合并到自己的war中)。首先看依赖jar的dependency:

    <dependency>
        <groupId>com.yeetrack.project</groupId>
        <artifactId>module-one</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>jar</type>
        <scope>system</scope> /** 注意是system,不是compile等其他 **/
        <systemPath>${project.basedir}/../module-one/target/module-one-1.0-SNAPSHOT.jar</systemPath>
    </dependency>
    

    再看依赖war的情况(两个依赖,一个都不能少):

    <dependencies>
        <dependency>
            <groupId>com.yeetrack.project</groupId>
            <artifactId>module-one</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>com.yeetrack.project</groupId>
            <artifactId>module-one</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>warpath</type>
        </dependency>
    </dependencies>
    

    OK,这是依赖的配置,下面是打包的配置,既然它都依赖其他的war了,那么它的打包类型也就是war。其实就是在使用maven-war-plugin的基础上添加一个maven-warpath-plugin:

    <build>
        <plugins>
             <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                     <configuration>
                            <dependentWarExcludes>WEB-INF/lib/*</dependentWarExcludes>
                     </configuration>
             </plugin>
             <plugin>
                 <groupId>org.appfuse</groupId>
                 <artifactId>maven-warpath-plugin</artifactId>
                 <version>1.0-SNAPSHOT</version>/**自己去google查找最新版**/
                 <extensions>true</extensions>
                <executions>
                    <execution>
                         <goals>
                        <goal>add-classes</goal>
                        </goals>
                    </execution>
                </executions>
             </plugin>
        </plugins>
    </build>
    

Over,最后打包的时候,在parent中执行mvn install即可。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)