SpringBoot项目FatJar同War之间的相互转换

1.原有的项目结构

启动类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class FactoryAccountServiceApplication{

    public static void main(String[] args) {
        SpringApplication.run(FactoryAccountServiceApplication.class, args);
    }


}

maven配置

单Springboot服务
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <!-- 一般生成的项目中并不会显式地声明packaging类型,默认为jar -->
    <packaging>jar</packaging>
    
    <build>
        <plugins>
            <!-- 用来声明服务的打包方式 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
使用maven多模块管理的Springboot

1.父pom文件

    <packaging>pom</packaging>
    <modules>
        <module>discovery-nacos</module>
        <module>consumer-nacos</module>
        <module>nacos-config</module>
    </modules>
    
     <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-boot.version>2.1.0.RELEASE</spring-boot.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    
    <!-- 管理依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <!-- 打包配置jdk版本, 可通过properties中的java.version配置 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.Springboot服务xml配置

使用spring-boot-maven-plugin必须使用 Maven 3.2 (or later)

    <packaging>jar</packaging>
    
    <parent>
        <artifactId>learn</artifactId>
        <groupId>com.chengbaiyi.learn</groupId>
        <version>1.0</version>
    </parent>
    
    <dependencies>
        ...
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定主类入口,若省略插件将搜索具有公共静态void main(String[]args)方法的类。 -->
                    <mainClass>com.chengbaiyi.LearnServiceApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!--可以把依赖的包都打包到生成的Jar包中,生成Fatjar必须添加该配置,
                            若未配置该信息,则需要在打包时声明$ mvn package spring-boot:repackage-->
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

修改后的项目结构

启动类

启动类需要继承SpringBootServletInitializer类,并重载configure(SpringApplicationBuilder)方法,来声明程序入口。帮助容器找到对应入口。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class FactoryAccountServiceApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(FactoryAccountServiceApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(FactoryAccountServiceApplication.class);
    }
}

pom文件修改

将jar包修改为war包,排除或者修改tomcat作用域为provided,添加maven-war-plugin打包配置(该部分可以省略)

    <packaging>war</packaging>
    
    <dependencies>
        ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!-- 表明了dependency 由JDK或者容器提供。只能作用在编译和测试时,同时没有传递性 -->
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>
        </plugins>
    </build>

常见的dependency的scope

complie

默认scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布。

provided

跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。

runtime

表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。

test

表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。

system

跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它


参考信息springboot maven打包:https://docs.spring.io/spring-boot/docs/2.1.11.BUILD-SNAPSHOT/reference/html/build-tool-plugins-maven-plugin.html

posted @ 2019-11-26 17:15  西罗(斗筲小人)  阅读(914)  评论(0编辑  收藏  举报