需求

使用maven打包时同时产出jar和war

解决思路

通过maven profiles的特性 + Jenkins 解决一键打两包问题

解决步骤

  1. 修改pom.xml packaging标签,使用占位符
<packaging>${project.packaging}</packaging>
  1. pom.xml添加多profiles
	<profiles>
        <profile>
            <id>prod-jar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <project.packaging>jar</project.packaging>
            </properties>
        </profile>
        <profile>
            <id>prod-tomcat</id>
            <properties>
                <project.packaging>war</project.packaging>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>tomcat-starterspring-boot-starter-tomcat</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>4.0.1</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <configuration>
                            <failOnMissingWebXml>false</failOnMissingWebXml>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

ps:maven依赖引入原则:(1)最短路径、(2)引入顺序自上而下。因此,profiles尽量写在denpendences下面

  1. 配置Jenkins

jar包命令为:

mvn celan package -DskipTests

war包命令为:

 mvn clean package -Pprod-tomcat -DskipTests

优点

环境之间隔离,如果war包对应不同的中间件比如jetty、东方通等,profile之间可以隔离,排除不同的依赖,便于后期维护扩展

缺点

不能做到像springboot那样自定义各种yml来通过spring.profiles.active引入,整体看起来比较乱