使SpringBoot 同时支持打包war和jar

1、修改pom.xml文件

1)增加一行,配置打包格式

<packaging>${project.packaging}</packaging>

(2)增加profiles特性(在war包格式发布时,需要去除jetty的依赖包),如果项目中有其他包中含有jetty,也需要一并去除。

<profiles>
    <profile>
        <id>jar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <project.packaging>jar</project.packaging>
        </properties>
    </profile>
    <profile>
        <id>war</id>
        <properties>
            <project.packaging>war</project.packaging>
        </properties>
        <dependencies>
            <dependency>
                <artifactId>crux-baseapp</artifactId>
                <groupId>com.crux</groupId>
                <version>1.0-war-SNAPSHOT</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-jetty</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </profile>
</profiles>

(3引入servlet依赖

<!--引入servlet-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

2. 增加ServletInitializer

在项目的Application启动类所在的package下增加如下文件,目的是初始化servlet以及jdbc驱动初始化。

在程序启动时,可能会遇到elasticsearch报错的问题,请联系相关开发同学处理。

@Slf4j
public class ServletInitializer extends SpringBootServletInitializer {
    @Override
 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        try {
            Class.forName("oracle.jdbc.OracleDriver");
 } catch (ClassNotFoundException e) {
            log.warn("can not load oracle.jdbc.OracleDriver");
 }
        return builder.sources(Application.class);
 }
}

3. 项目构建

(1) 命令行方式

maven增加profile配置后,原有打jar包和docker镜像的方法不变,如果需要构建war包,使用如下命令:

mvn -U clean package -Pwar -Dmaven.test.skip=true

在构建前可以检查一下需要排除的jetty相关jar包是否排除干净

mvn dependency:tree

(2)IDEA 中直接构建

在maven条目的Profiles中勾选要打包的类型,直接点击package即可。

注意如果项目中有测试类,需要在pom文件夹中加入以下配置,排除test文件夹,或者直接使用命令行方式

<build>
    <plugins>
        <!--打包编译的时候排除test测试类-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>