springboot多模塊項目(包含頁面)創建和打包發佈-3

三、使用maven進行編譯打包發佈

1、瞭解maven插件

1)單純使用maven時,可以使用maven命令直接進行創建maven工程和編譯打包發佈等等,當前我們在工具(idea或者eclipse)中操作,實際上到最後還是maven命令,命令不在這裏介紹,可自行補習;
2)maven普通項目功能打包插件我們經常用到

 <build>
        <plugins>
            <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>

注意:如果使用的是jdk1.8,代碼裏面如果有新用法,比如一些函數方式的代碼使用,需要指定好版本信息,不然存在不能使用的錯誤;
按照此方式編譯打包之後,(注意,按照順序:clean-compile-package-install 進行,),打包之後在項目target目錄下會有相應的jar包:
在這裏插入圖片描述
注意:這個jar包是不能夠直接執行的,只能拿來供別的模塊或項目引用;

3)springboot中自帶maven插件

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
</build>

使用這個插件後我們可以看到target目錄下會有:
在這裏插入圖片描述
如上圖這兩個jar文件,
注意:根據上面插件設置打包,
baseService-1.0.1.jar是可執行jar包,但是不能供別的模塊或項目依賴使用;
baseService-1.0.1.jar.original 是不可執行jar包,可以用於別的模塊或項目依賴使用;

然後更改設置:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

可以看到,加了一個classifier配置,然後執行clean-compile-package
可以看到target目錄下生成:
在這裏插入圖片描述
這兩個jar文件,第一個不可執行,但是能被別的項目或模塊所依賴;
第二個baseService-1.0.1-exec.jar 是可以執行的jar文件;



具體瞭解:

:“爲什麼我的 Spring Boot 項目打包成的 jar ,被其他項目依賴之後,總是報找不到類的錯誤?”
大夥有這樣的疑問,就是因爲還沒搞清楚可執行 jar 和普通 jar 到底有什麼區別?今天鬆哥就和大家來聊一聊這個問題。

多了一個插件
Spring Boot 中默認打包成的 jar 叫做 可執行 jar,這種 jar 不同於普通的 jar,普通的 jar 不可以通過 java -jar xxx.jar 命令執行,普通的 jar 主要是被其他應用依賴,Spring Boot 打成的 jar 可以執行,但是不可以被其他的應用所依賴,即使強制依賴,也無法獲取裏邊的類。但是可執行 jar 並不是 Spring Boot 獨有的,Java 工程本身就可以打包成可執行 jar 。

有的小夥伴可能就有疑問了,既然同樣是執行 mvn package 命令進行項目打包,爲什麼 Spring Boot 項目就打成了可執行 jar ,而普通項目則打包成了不可執行 jar 呢?

這我們就不得不提 Spring Boot 項目中一個默認的插件配置 spring-boot-maven-plugin ,這個打包插件存在 5 個方面的功能,從插件命令就可以看出:
在這裏插入圖片描述
五個功能分別是:

  • repackage:這個是默認 goal,在 mvn package 執行之後,這個命令再次打包生成可執行的 jar,同時將 mvn package 生成的 jar 重命名爲 *.origin
  • run:這個可以用來運行 Spring Boot 應用
  • start:這個在 mvn integration-test 階段,進行 Spring Boot 應用生命週期的管理
  • stop:這個在 mvn integration-test 階段,進行 Spring Boot 應用生命週期的管理
    這裏功能,默認情況下使用就是 repackage 功能,其他功能要使用,則需要開發者顯式配置。

打包
repackage 功能的 作用,就是在打包的時候,多做一點額外的事情:

首先 mvn package 命令 對項目進行打包,打成一個 jar,這個 jar 就是一個普通的 jar,可以被其他項目依賴,但是不可以被執行
repackage 命令,對第一步 打包成的 jar 進行再次打包,將之打成一個 可執行 jar ,通過將第一步打成的 jar 重命名爲 *.original 文件
舉個例子:
對任意一個 Spring Boot 項目進行打包,可以執行 mvn package 命令,也可以直接在 IDEA 中點擊 package ,如下 :
在這裏插入圖片描述
打包成功之後, target 中的文件如下:
在這裏插入圖片描述

這裏有兩個文件,第一個 restful-0.0.1-SNAPSHOT.jar 表示打包成的可執行 jar ,第二個 restful-0.0.1-SNAPSHOT.jar.original 則是在打包過程中 ,被重命名的 jar,這是一個不可執行 jar,但是可以被其他項目依賴的 jar。通過對這兩個文件的解壓,我們可以看出這兩者之間的差異。

兩種 jar 的比較
可執行 jar 解壓之後,目錄如下:
在這裏插入圖片描述
可以看到,可執行 jar 中,我們自己的代碼是存在 於 BOOT-INF/classes/ 目錄下,另外,還有一個 META-INF 的目錄,該目錄下有一個 MANIFEST.MF 文件,打開該文件,內容如下:

Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: org.javaboy.restful.RestfulApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

可以看到,這裏定義了一個 Start-Class,這就是可執行 jar 的入口類,Spring-Boot-Classes 表示我們自己代碼編譯後的位置,Spring-Boot-Lib 則表示項目依賴的 jar 的位置。

換句話說,如果自己要打一個可執行 jar 包的話,除了添加相關依賴之外,還需要配置 META-INF/MANIFEST.MF 文件。

這是可執行 jar 的結構,那麼不可執行 jar 的結構呢?

我們首先將默認的後綴 .original 除去,然後給文件重命名,重命名完成,進行解壓:
在這裏插入圖片描述
解壓後可以看到,不可執行 jar 根目錄就相當於我們的 classpath,解壓之後,直接就能看到我們的代碼,它也有 META-INF/MANIFEST.MF 文件,但是文件中沒有定義啓動類等。

Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0

注意

這個不可以執行 jar 也沒有將項目的依賴打包進來。

從這裏我們就可以看出,兩個 jar ,雖然都是 jar 包,但是內部結構是完全不同的,因此一個可以直接執行,另一個則可以被其他項目依賴。

一次打包兩個 jar
一般來說,Spring Boot 直接打包成可執行 jar 就可以了,不建議將 Spring Boot 作爲普通的 jar 被其他的項目所依賴。如果有這種需求,建議將被依賴的部分,單獨抽出來做一個普通的 Maven 項目,然後在 Spring Boot 中引用這個 Maven 項目。

如果非要將 Spring Boot 打包成一個普通 jar 被其他項目依賴,技術上來說,也是可以的,給 spring-boot-maven-plugin 插件添加如下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

配置的 classifier 表示可執行 jar 的名字,配置了這個之後,在插件執行 repackage 命令時,就不會給 mvn package 所打成的 jar 重命名了,所以,打包後的 jar 如下:
在這裏插入圖片描述
第一個 jar 表示可以被其他項目依賴的 jar ,第二個 jar 則表示一個可執行 jar.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章