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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM