Maven 多个war项目的引用关系 overlay配置实例

    xiaoxiao2023-09-28  150

    在Maven项目中,一般是jar文件的依赖,但是也要考虑一种情况,那就是war项目的依赖。

    比如说base war项目包含基本的网页,但是需要为另外有一个定制的war项目有几个页面是需要特别定制的。

    直接拷贝base war所有的页面到新的定制的war项目,会带来很大的冗余,并且以后公共的部分有问题的话,需要两处一起修改,这不是个好的解决办法。

    Maven 的war plugin 的overlay可以解决这个问题

    1) 完成后的文件列表:

    a)注意其中的黄色部分在两个项目中都有,否则会导致第二个Springboot application 无法启动

    b) 在为WX项目打包的时候,红色的index.html会被蓝色的index.html覆盖

     

    2) 父项目的pom文件, 注意项目packaging 为pom, 而不是Jar或者war

    并且列出了下属的子maven module

    <?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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> </parent> <groupId>com.sz</groupId> <artifactId>EstateManagementProject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>Parent</name> <description>父项目</description> <modules> <module>EstateManagement-Base</module> <module>EstateManagement-WX</module> </modules> </project>

    3) base 子项目的pom文件, 普通的一个SpringBoot 项目

    <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.sz</groupId> <artifactId>EstateManagementProject</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.sz</groupId> <artifactId>EstateManagement-Base</artifactId> <packaging>war</packaging> <name>EstateManagement-Base Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>base</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

    4) WX子项目的pom文件:

    a)依赖于base项目

    b)SpringBoot打包的时候排除base项目,否则会把base以war的形式放在lib-provided,浪费空间

    c) overlay部分指定依赖base项目

    d) 可以排除某些文件

    <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.sz</groupId> <artifactId>EstateManagementProject</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>zhishusz2</groupId> <artifactId>EstateManagement-WX</artifactId> <packaging>war</packaging> <name>EstateManagement-WX</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.sz</groupId> <artifactId>EstateManagement-Base</artifactId> <version>0.0.1-SNAPSHOT</version> <type>war</type> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>wx</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <!-- 不要把依赖的war包含到本地lib-provided目录 --> <groupId>com.sz</groupId> <artifactId>EstateManagement-Base</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <overlays> <overlay> <groupId>com.sz</groupId> <artifactId>EstateManagement-Base</artifactId> <!-- 排除指定的文件 --> <excludes> <exclude>WEB-INF/classes/com/bank2/exclude/**</exclude> </excludes> </overlay> </overlays> <failOnMissingWebXml>false</failOnMissingWebXml> <!-- class文件会自动打JAR包 --> <archiveClasses>false</archiveClasses> </configuration> </plugin> </plugins> </build> </project>

    5) 以SpringBoot启动wx项目后,无法访问base项目的 base/index.html文件,但是以普通tomcat的war项目启动,则没有这个限制。

    6)附加,BASE项目可以用把class文件单独打包并发布到Maven repository

    <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <!-- 把class打包jar作为附件 --> <attachClasses>true</attachClasses> </configuration> </plugin>

    然后WX项目可以用以下依赖

    <dependency>     <groupId>com.sz</groupId>     <artifactId>EstateManagement-Base</artifactId>     <version>0.0.1-SNAPSHOT</version>     <type>jar</type>     <classifier>classes</classifier>     <scope>provided</scope> </dependency> 

     

     

     

     

    最新回复(0)