最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

maven項(xiàng)目的打包實(shí)現(xiàn)方式

 更新時(shí)間:2026年04月28日 14:38:52   作者:程序員阿偉  
本文介紹了Maven打包項(xiàng)目,分為小包和大包兩種概念,小包僅包含項(xiàng)目代碼,大包包含項(xiàng)目代碼及依賴,文中詳細(xì)描述了使用IDEA自帶Maven工具和第三方打包插件(maven-assembly-plugin、maven-shade-plugin)打包大包的方式,并指出推薦使用maven-assembly-plugin

前言

現(xiàn)在都是使用idea中maven插件來打包項(xiàng)目,因此此文章將基于idea中的maven插件打包。

概念

打包分為小包和大包兩種概念:

  • 小包:只打包我們寫的代碼,不打包代碼依賴的其他jar包。
  • 大包:打包項(xiàng)目本身的代碼以及項(xiàng)目所依賴的其他jar包。

因此,如果我們的項(xiàng)目代碼只需要被別的代碼引用,也就是不需要啟動(dòng)類去運(yùn)行,那么打包成小包即可,如果我們的項(xiàng)目需要獨(dú)立的運(yùn)行,需要啟動(dòng)類去運(yùn)行,那么就需要打包成大包。

準(zhǔn)備

我們先創(chuàng)建一個(gè)maven項(xiàng)目,創(chuàng)建一個(gè)啟動(dòng)類,隨便引入一個(gè)其他依賴。

啟動(dòng)類

pom文件

打包方式

idea自帶的maven工具

首先使用idea中自帶的maven工具打包,idea的maven工具也能打大包和小包。

小包打包第一種方式

小包打包直接運(yùn)行maven中的package即可。

可以看到target目錄下生成了jar包

查看生成的jar包

可以看到只有我們項(xiàng)目的代碼,引入的依賴并沒有被一起打包

這里也就不測試能不能通過命令java -jar *.jar 去運(yùn)行jar包了,因?yàn)檫@是小包,根據(jù)小包的作用,我們是并不需要去運(yùn)行。

這里我可以告訴你,并不能運(yùn)行,因?yàn)槲覀兇虬臅r(shí)候并沒有去指定啟動(dòng)類的路徑,也就是在META-INF目錄下的MANIFEST.MF文件中指定啟動(dòng)類。

小包打包第二種方式

大包打包我們是需要指定啟動(dòng)類并且將其他依賴一起打包的。

配置打包信息

配置完后,我們可以看到引入的依賴也在被打包的范圍,同時(shí)如果我們不想打包某個(gè)jar包進(jìn)來,可以在此面板選擇刪除,這樣就不會(huì)一同被打包了。

然后去編譯打包

可以看到生成了out輸出文件夾,并且引入的依賴也一同被打包到同個(gè)目錄下了,但是還是沒有合并成同一個(gè)jar,如果要運(yùn)行的話,必須將依賴的jar放在同一個(gè)目錄中才能正常運(yùn)行。

我們來查看以下生成的jar包

我們發(fā)現(xiàn),打包的jar貌似比小包更簡潔,而且也只有我們本身的java代碼,沒有MANIFTEST文件,沒有的話肯定是無法運(yùn)行的,因?yàn)槔锩嬗涗泦?dòng)類的路徑以及依賴jar包的存放路徑。

很奇怪,我們的MANIFEST文件跑到這里了,并沒有被一同打包。

可以看到MANIFEST中已經(jīng)生成了jar的存放路徑和啟動(dòng)類的路徑

原來,我們的這種打包方式必須要和打包插件共同使用,后面會(huì)介紹幾種打包插件。

這樣的打包方式也有解決方法,就是將我們打包的jar解壓,將MANIFEST文件放進(jìn)去再壓縮,最后將壓縮好的jar包和引入的jar包放在同一個(gè)目錄中即可運(yùn)行。

小包總結(jié)

從 上面的兩種方式可以看出來,idea自帶的打包方式,只能打包成小包,源碼的部分只有項(xiàng)目本身的代碼。這種 Jar 包就是所謂的 “小包”。

大包打包

從前面來看,打包打包需要使用到第三方插件,以下來介紹一些第三方的打包插件。

maven-compiler-plugin

maven-compiler-plugin是一個(gè)Maven插件,可以用來指定項(xiàng)目源碼的jdk版本,編譯后的jdk版本,以及編碼格式。

單獨(dú)的使用并不會(huì)打包成大包,還是會(huì)打成小包,因此一般用來與其他第三方的打包插件聯(lián)合使用。

依賴配置

<build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven編譯的jdk版本,如果不指定,maven3默認(rèn)用jdk 1.5 maven2默認(rèn)用jdk1.3 -->
                    <source>1.8</source> <!-- 源代碼使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目標(biāo)class文件的編譯版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集編碼 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

打包測試

效果

可以看到只有源碼被打包而已。

maven-jar-plugin和maven-dependency-plugin

這兩個(gè)插件是一起使用的,首先是不推薦使用這種,此種打包方式有一個(gè)比較明顯的缺點(diǎn):打包后會(huì)在target目錄下生成lib目錄(存放依賴 Jar)和項(xiàng)目 Jar。也就是說由于依賴都存在于lib目錄中,所以要想運(yùn)行 Jar 包,必須將 Jar 包和lib目錄放在同一個(gè)路徑下。

maven-jar-plugin

首先說maven-jar-plugin插件,它的思想就是:指定啟動(dòng)類、指定依賴包相對(duì)于項(xiàng)目最終 Jar 包所在的路徑、給MANIFEST.MF文件添加Class-Path屬性(運(yùn)行項(xiàng)目 Jar 包時(shí)會(huì)根據(jù)Class-Path屬性來找到其他依賴 Jar 包的路徑),因此這個(gè)插件就是個(gè)配置MANIFEST.MF文件的插件。

maven-dependency-plugin

這個(gè)插件才是打包項(xiàng)目的其他依賴,因此這個(gè)必須配合上面的插件使用,兩者缺一不可。

依賴配置

<build>
    <!-- 項(xiàng)目最終打包成的名字 -->
    <finalName>community</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <!-- 會(huì)在 MANIFEST.MF 中生成 Class-Path 項(xiàng) -->
                        <!-- 系統(tǒng)會(huì)根據(jù) Class-Path 項(xiàng)配置的路徑加載依賴 -->
                        <addClasspath>true</addClasspath>
                        <!-- 指定依賴包所在目錄,相對(duì)于項(xiàng)目最終 Jar 包的路徑 -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- 指定 MainClass -->
                        <mainClass>com.ronz.community.CommunityApplication</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 配置依賴包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <!-- 相當(dāng)于執(zhí)行 mvn 命令,將依賴打包到指定目錄 -->
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--將依賴打包至 target 下的 lib 目錄-->
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

效果

所以說想要運(yùn)行項(xiàng)目,必須將lib和源碼jar包放在同一個(gè)目錄下才行,這樣顯然是不太方便的。

maven-assembly-plugin

使用maven-assembly-plugin插件打出來的包只有一個(gè) Jar 包,這個(gè) Jar 包中包含了項(xiàng)目代碼以及依賴的代碼。

也就意味著此種方式打出來的 Jar 包可以直接通過java -jar xxx.jar的命令來運(yùn)行。而且我們可以聯(lián)合maven-compiler-plugin插件來使用。

缺點(diǎn)

maven-assembly-plugin 同名類覆蓋時(shí)會(huì)出現(xiàn)問題。

依賴配置

    <build>
        <!-- 項(xiàng)目最終打包成的名字 -->
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven編譯的jdk版本,如果不指定,maven3默認(rèn)用jdk 1.5 maven2默認(rèn)用jdk1.3 -->
                    <source>1.8</source> <!-- 源代碼使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目標(biāo)class文件的編譯版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集編碼 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <!-- 指定啟動(dòng)類 -->
                        <manifest>
                            <mainClass>com.cw.HelloStart</mainClass>
                        </manifest>
                    </archive>
                    <!-- 描述后綴 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <!-- 相當(dāng)于在執(zhí)行 package 打包時(shí),在后面加上 assembly:single  -->
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

效果

兩者的區(qū)別

test-jar-with-dependencies.jar

test.jar

明顯可以看到test-jar-with-dependencies.jar才是我們需要的。

maven-shade-plugin

根據(jù) Maven 的官方文檔介紹,maven-shade-plugin是一個(gè)強(qiáng)大的打包插件。

它同樣可以將項(xiàng)目的依賴以及項(xiàng)目的源碼打包成一個(gè)可執(zhí)行 Jar 包。

依賴配置

    <build>
        <!-- 項(xiàng)目最終打包成的名字 -->
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven編譯的jdk版本,如果不指定,maven3默認(rèn)用jdk 1.5 maven2默認(rèn)用jdk1.3 -->
                    <source>1.8</source> <!-- 源代碼使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目標(biāo)class文件的編譯版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集編碼 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <!-- 指定啟動(dòng)類 -->
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.cw.HelloStart</mainClass>
                                </transformer>
                                <!-- 下面的配置僅針對(duì)存在同名資源文件的情況,如沒有則不用配置-->
                                <!-- 有些項(xiàng)目包可能會(huì)包含同文件名的資源文件(例如屬性文件)-->
                                <!-- 為避免覆蓋,可以將它們的內(nèi)容合并到一個(gè)文件中 -->
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

效果

兩種第三方插件打包方式的總結(jié)

使用第二種方式的assembly打包出來的 Jar 包多多少少有些問題,但是使用第三種方式打包出來的 Jar 包一般都是可用的。所以在將項(xiàng)目打包為大包時(shí),還是推薦使用第三種打包的方式。

如果是大數(shù)據(jù)項(xiàng)目中,我們?nèi)粘J褂帽容^多的是maven-assembly-plugin插件,例如:大數(shù)據(jù)項(xiàng)目中往往有很多shell腳本、SQL腳本、.properties.xml配置項(xiàng)等,采用assembly插件可以讓輸出的結(jié)構(gòu)清晰而標(biāo)準(zhǔn)化。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解

    SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解

    這篇文章主要介紹了SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot中使用攔截器的配置詳解

    SpringBoot中使用攔截器的配置詳解

    這篇文章主要介紹了SpringBoot中使用攔截器的配置詳解,攔截器是?AOP?的一種實(shí)現(xiàn),專門攔截對(duì)動(dòng)態(tài)資源的后臺(tái)請(qǐng)求,即攔截對(duì)控制層的請(qǐng)?求,使用場景比較多的是判斷用戶是否有權(quán)限請(qǐng)求后臺(tái),需要的朋友可以參考下
    2024-01-01
  • 淺談java項(xiàng)目與javaweb項(xiàng)目導(dǎo)入jar包的區(qū)別

    淺談java項(xiàng)目與javaweb項(xiàng)目導(dǎo)入jar包的區(qū)別

    下面小編就為大家分享一篇淺談java項(xiàng)目與javaweb項(xiàng)目導(dǎo)入jar包的區(qū)別,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot接口參數(shù)校驗(yàn)(Bean Validation)實(shí)戰(zhàn)指南

    SpringBoot接口參數(shù)校驗(yàn)(Bean Validation)實(shí)戰(zhàn)指南

    在開發(fā)接口時(shí),參數(shù)校驗(yàn)是必不可少的環(huán)節(jié):前端傳參是否為空、格式是否正確、數(shù)值是否合法,都需要后端嚴(yán)格校驗(yàn),否則很容易出現(xiàn)臟數(shù)據(jù)、程序異常,SpringBoot 官方推薦使用?Bean Validation,今天就來介紹一下基礎(chǔ)注解、實(shí)戰(zhàn)使用,需要的朋友可以參考下
    2026-03-03
  • java判斷今天,昨天,前天,不能用秒間隔的簡單實(shí)例

    java判斷今天,昨天,前天,不能用秒間隔的簡單實(shí)例

    下面小編就為大家?guī)硪黄猨ava判斷今天,昨天,前天,不能用秒間隔的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 從入門到精通詳解SpringBoot中請(qǐng)求參數(shù)注解的完全指南

    從入門到精通詳解SpringBoot中請(qǐng)求參數(shù)注解的完全指南

    我們應(yīng)該如何在后端優(yōu)雅地接收這些參數(shù),Spring?Boot提供了一系列注解來幫助我們輕松完成請(qǐng)求參數(shù)的綁定,本文將對(duì)其中最常用的注解進(jìn)行詳細(xì)講解,包括它們的用法、區(qū)別以及最佳實(shí)踐
    2026-05-05
  • SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類型。(本文使用MyBatis-Plus)。在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到表示類型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場景的方案對(duì)比,并用實(shí)例來介紹如何用枚舉這種最優(yōu)雅的來表示
    2022-10-10
  • 利用JSONObject.toJSONString()包含或排除指定的屬性

    利用JSONObject.toJSONString()包含或排除指定的屬性

    這篇文章主要介紹了利用JSONObject.toJSONString()包含或排除指定的屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • MyBatis-plus的五種批量插入方式對(duì)比分析

    MyBatis-plus的五種批量插入方式對(duì)比分析

    本文主要介紹了MyBatis-plus的五種批量插入方式對(duì)比分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot全局日期格式配置的方法總結(jié)

    SpringBoot全局日期格式配置的方法總結(jié)

    本文介紹了在SpringBoot中避免在每個(gè)實(shí)體類中重復(fù)設(shè)置@JsonFormat注解的幾種方法,包括全局配置、自定義Jackson配置類、使用Mixin、自定義注解等,推薦使用全局配置,可以簡化代碼并滿足大部分場景,需要的朋友可以參考下
    2026-01-01

最新評(píng)論

寿宁县| 东辽县| 交口县| 湖北省| 同仁县| 栖霞市| 聂荣县| 射阳县| 裕民县| 东海县| 沅陵县| 温宿县| 五寨县| 南通市| 上虞市| 蓬安县| 六盘水市| 湘潭县| 金昌市| 博湖县| 沧州市| 平遥县| 兴隆县| 石家庄市| 偏关县| 黄骅市| 舟曲县| 娱乐| 游戏| 措美县| 丰原市| 阜新| 雅安市| 南召县| 绩溪县| 古田县| 达拉特旗| 岐山县| 布拖县| 铁岭县| 礼泉县|