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

Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題

 更新時(shí)間:2023年10月17日 08:44:57   作者:拾年一劍  
這篇文章主要給大家介紹了關(guān)于Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題,將依賴打入jar包,由于maven管理了所有的依賴,所以將項(xiàng)目的代碼和依賴打成一個(gè)包對(duì)它來說是順理成章的功能,需要的朋友可以參考下

需求

普通的Maven Java項(xiàng)目(非Springboot項(xiàng)目),需要打包成一個(gè)jar包(包含所有的第三方依賴jar包),能夠放在服務(wù)器上單獨(dú)運(yùn)行。

遇到的問題

找不到主類

大家都知道,如果使用常見的maven-jar-plugin打包,只能將自己項(xiàng)目里的源碼編譯打包,不會(huì)包含第三方的jar包。

如果該項(xiàng)目沒有第三方依賴包,則可以通過maven-jar-plugin打包,直接執(zhí)行打好的jar包(java -jar xxx.jar),可能會(huì)遇到找不到主類的情況,可以通過下面的方式解決:指定主類

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.xxx.AppMain</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

注意:

META-INF文件夾是MANIFEST.MF文件的主頁(yè)。 此文件包含有關(guān)JAR內(nèi)容的元數(shù)據(jù)。
JAR包中的/META-INF/MANIFEST.MF元數(shù)據(jù)文件必須包含Main-Class(主類)信息。(工程里的src/META-INF/MANIFEST.MF)
項(xiàng)目所有的依賴都必須在Classpath中,其可以通過 MANIFEST.MF 指定或者隱式設(shè)置。

打包時(shí)沒有包含第三方依賴

如果該項(xiàng)目有第三方依賴包,通過上面的方式打包,是不會(huì)包含第三方依賴的,直接運(yùn)行生成的jar包會(huì)出錯(cuò)(相關(guān)依賴不存在)。
想要打包時(shí)包含第三方依賴,又可以分兩種情況:

情況1

打包成可執(zhí)行jar文件,但是將所有依賴(包括外部依賴)單獨(dú)打包到另外一個(gè)指定文件夾下,通過指定Class-Path的方式關(guān)聯(lián)。

  • 打包依賴到指定文件夾
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

關(guān)于Maven dependency plugin可以參考我的另外一篇博客,有詳細(xì)介紹:

Maven dependency plugin使用

  • 指定啟動(dòng)入口,并關(guān)聯(lián)依賴
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <!-- 是否綁定依賴,將外部jar包依賴加入到classPath中 -->
                <addClasspath>true</addClasspath>
                <!-- 依賴前綴,與之前設(shè)置的文件夾路徑要匹配 -->
                <classpathPrefix>lib/</classpathPrefix>
                <!-- 主函數(shù)的入口 -->
                <mainClass>com.xxx.AppMain</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

配置好后,可以通過下面的命令編譯打包:
mvn clean pacakge -DskipTests=true

注意,復(fù)雜情況下,classpath需要在運(yùn)行時(shí)指定,如 java -cp …

情況2

將整個(gè)工程打成一個(gè)可執(zhí)行jar包,包含所有的依賴。

需要通過maven-assembly-plugin插件來打包,可以實(shí)現(xiàn)該需求。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.xxx.AppMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置好后,可以通過下面的命令編譯打包:
mvn assembly:assembly執(zhí)行成功后會(huì)在target文件夾下多出一個(gè)以-jar-with-dependencies結(jié)尾的jar包. 這個(gè)jar包就包含了項(xiàng)目所依賴的所有jar的class。

擴(kuò)展問題

不希望依賴的jar包變成class

可以通過修改插件的配置做到

  • 在本地maven倉(cāng)庫(kù)里找到maven-assembly-plugin
cd ~/.m2/repository/org/apache/maven/plugins/maven-assembly-plugin/
  • 進(jìn)入打包時(shí)運(yùn)行使用的版本里,如2.2-beta-5;
  • 解壓maven-assembly-plugin-2.2-beta-5.jar;
  • 進(jìn)入解壓好的文件夾找到assemblies\jar-with-dependencies.xml,
    把里面的UNPACK改成FALSE,保存即可;
  • 還原解壓后的文件為jar包
    例如,在~/.m2/repository/org/apache/maven/plugins/maven-assembly-plugin/2.2-beta-5 路徑里,執(zhí)行下面的命令
jar cvfm maven-assembly-plugin-2.2-beta-5.jar maven-assembly-plugin-2.2-beta-5/META-INF/MANIFEST.MF -C maven-assembly-plugin-2.2-beta-5 .
  • 再次使用mvn assembly:assembly打包,編譯好的以-jar-with-dependencies結(jié)尾的jar包. 這個(gè)jar包就包含了項(xiàng)目所依賴的所有jar文件,不再是class;

項(xiàng)目里多個(gè)主類,如何動(dòng)態(tài)指定

可以通過自定義property屬性,在執(zhí)行maven命令時(shí),動(dòng)態(tài)指定來實(shí)現(xiàn),配置如下:

例如,main.class 則為自定義的;

<properties>
    <main.class>com.xxx.AppMain</main.class>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

運(yùn)行maven命令時(shí),動(dòng)態(tài)指定:

mvn -Dmain.class=com.xxx.AppMain2 assembly:assembly

總結(jié) 

到此這篇關(guān)于Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題的文章就介紹到這了,更多相關(guān)Maven打包依賴到j(luò)ar內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis配置雙數(shù)據(jù)源/多數(shù)據(jù)源的實(shí)踐方式

    mybatis配置雙數(shù)據(jù)源/多數(shù)據(jù)源的實(shí)踐方式

    本文介紹了如何在Spring Boot項(xiàng)目中配置兩個(gè)數(shù)據(jù)源,兩個(gè)MyBatis實(shí)例,以及如何使用MyBatis Generator和PageHelper插件進(jìn)行數(shù)據(jù)庫(kù)操作和分頁(yè),通過配置多個(gè)數(shù)據(jù)源,可以實(shí)現(xiàn)對(duì)不同數(shù)據(jù)庫(kù)的訪問,同時(shí),MyBatis Generator可以幫助快速生成MyBatis的Mapper和XML文件,提高開發(fā)效率
    2025-11-11
  • Java多線程編程中的并發(fā)安全問題及解決方法

    Java多線程編程中的并發(fā)安全問題及解決方法

    保障多線程并發(fā)安全,解決線程同步與鎖競(jìng)爭(zhēng)問題,提高應(yīng)用性能與可靠性。多線程編程需要考慮線程安全性,使用同步機(jī)制保證共享變量的一致性,避免線程競(jìng)爭(zhēng)導(dǎo)致的數(shù)據(jù)不一致與死鎖等問題。常用的同步機(jī)制包括synchronized、ReentrantLock、volatile等
    2023-04-04
  • Java插入、替換和刪除PDF圖像的操作完整指南

    Java插入、替換和刪除PDF圖像的操作完整指南

    在當(dāng)今數(shù)字化的世界中,PDF 已經(jīng)成為文檔交換的標(biāo)準(zhǔn)格式,本教程將深入探討如何使用 Spire.PDF for Java 庫(kù),輕松實(shí)現(xiàn) PDF 圖像的添加、替換與刪除操作,希望對(duì)大家有一定的幫助
    2025-10-10
  • Java設(shè)計(jì)模式中的抽象工廠模式解讀

    Java設(shè)計(jì)模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計(jì)模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11
  • Java文件字符輸入流FileReader讀取txt文件亂碼的解決

    Java文件字符輸入流FileReader讀取txt文件亂碼的解決

    這篇文章主要介紹了Java文件字符輸入流FileReader讀取txt文件亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實(shí)現(xiàn)插入排序算法可視化的示例代碼

    Java實(shí)現(xiàn)插入排序算法可視化的示例代碼

    插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。其原理是通過構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將用Java語言實(shí)現(xiàn)插入排序算法并進(jìn)行可視化,感興趣的可以了解一下
    2022-08-08
  • SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案流程分析

    SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案流程分析

    SpringBoot項(xiàng)目中,基于Token的登錄授權(quán)方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構(gòu),而JWT雖無狀態(tài),但存在過期時(shí)間不可強(qiáng)制失效、一次性等缺點(diǎn),本文介紹SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案,感興趣的朋友一起看看吧
    2024-09-09
  • Java+WebSocket實(shí)現(xiàn)簡(jiǎn)單實(shí)時(shí)雙人協(xié)同pk答題系統(tǒng)

    Java+WebSocket實(shí)現(xiàn)簡(jiǎn)單實(shí)時(shí)雙人協(xié)同pk答題系統(tǒng)

    在實(shí)時(shí)互動(dòng)應(yīng)用中,實(shí)現(xiàn)流暢的多人協(xié)同對(duì)戰(zhàn)功能是一大挑戰(zhàn),WebSocket技術(shù),以其全雙工通信能力,提供了解決方案,本文我們就來使用WebSocket實(shí)現(xiàn)簡(jiǎn)單實(shí)時(shí)雙人協(xié)同pk答題系統(tǒng)吧
    2025-06-06
  • Java中BigDecimal的舍入模式解析(RoundingMode)

    Java中BigDecimal的舍入模式解析(RoundingMode)

    這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java中關(guān)于文本文件的讀寫方法實(shí)例總結(jié)

    java中關(guān)于文本文件的讀寫方法實(shí)例總結(jié)

    這篇文章主要介紹了java中關(guān)于文本文件的讀寫方法,實(shí)例總結(jié)了Java針對(duì)文本文件讀寫的幾種常用方法,并對(duì)比了各個(gè)方法的優(yōu)劣及特點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

永泰县| 阳泉市| 邢台市| 韶关市| 蒙山县| 宁南县| 沐川县| 淮北市| 绍兴县| 扎兰屯市| 永清县| 图木舒克市| 法库县| 霍州市| 广元市| 辉南县| 瑞丽市| 大连市| 阳新县| 河西区| 鄂托克前旗| 西城区| 淄博市| 通江县| 绥滨县| 县级市| 永和县| 方正县| 遂平县| 色达县| 桃园县| 高雄县| 高台县| 娄烦县| 南昌县| 咸宁市| 太康县| 衡阳县| 武鸣县| 万源市| 安顺市|