亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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文件的主頁。 此文件包含有關(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倉庫里找到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)文章

  • Java spring單點(diǎn)登錄系統(tǒng)

    Java spring單點(diǎn)登錄系統(tǒng)

    這篇文章主要介紹了Java spring單點(diǎn)登錄系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    這篇文章主要介紹了如何基于LoadingCache實(shí)現(xiàn)Java本地緩存,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java 中的控制反轉(zhuǎn)(IOC)詳解

    Java 中的控制反轉(zhuǎn)(IOC)詳解

    這篇文章主要介紹了理解Java 中的IOC控制反轉(zhuǎn),具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-10-10
  • Spring?Security權(quán)限管理小結(jié)

    Spring?Security權(quán)限管理小結(jié)

    SpringSecurity是一個(gè)權(quán)限管理框架,核心是認(rèn)證和授權(quán),前面已經(jīng)系統(tǒng)的給大家介紹過了認(rèn)證的實(shí)現(xiàn)和源碼分析,本文重點(diǎn)來介紹下權(quán)限管理,需要的朋友可以參考下
    2022-08-08
  • Java加載properties文件實(shí)現(xiàn)方式詳解

    Java加載properties文件實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Java加載properties文件實(shí)現(xiàn)方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java Arrays類詳解及實(shí)例代碼

    java Arrays類詳解及實(shí)例代碼

    這篇文章主要介紹了java Arrays類詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • JAVA及相關(guān)字符集編碼問題研究分享

    JAVA及相關(guān)字符集編碼問題研究分享

    對(duì)于JAVA學(xué)習(xí),或多或少都會(huì)遇到這樣的問題:編碼基本知識(shí),java,系統(tǒng)軟件,url,工具軟件等
    2014-10-10
  • JavaWeb Spring注解Annotation深入學(xué)習(xí)

    JavaWeb Spring注解Annotation深入學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了JavaWeb Spring注解Annotation,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java基礎(chǔ)知識(shí)I/O流使用詳解

    java基礎(chǔ)知識(shí)I/O流使用詳解

    編程語言的I/O類庫中常常使用流這個(gè)抽象的概念,它代表任何有能力產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象或時(shí)有能力接收數(shù)據(jù)的接收端對(duì)象,本文為大家介紹Java中I/O系統(tǒng)基礎(chǔ)知識(shí)
    2014-01-01
  • Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹

    Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹

    這篇文章主要介紹了Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖的有關(guān)內(nèi)容,涉及hibernate的隔離機(jī)制,以及實(shí)現(xiàn)悲觀鎖和樂觀鎖的代碼實(shí)現(xiàn),需要的朋友可以了解下。
    2017-09-09

最新評(píng)論