Maven - 打包可執(zhí)行jar包

打包方法

方法一:使用maven-jar-pluginmaven-dependency-plugin

首先,maven-jar-plugin的作用是配置mainClass和指定classpath堰塌。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                    org.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

addClasspath: 是否在manifest文件中添加classpath。默認(rèn)為false庄撮。如果為true唯竹,則會(huì)在manifest文件中添加classpath沸停,這樣在啟動(dòng)的時(shí)候就不用再手動(dòng)指定classpath了。如下所示良狈,文件中增加了Class-Path一行

Manifest-Version: 1.0                                                                                                                                         
Archiver-Version: Plexus Archiver
Built-By: michealyang
Class-Path: libs/jetty-server-9.4.7.v20170914.jar lib/javax.servlet-api
 -3.1.0.jar libs/jetty-http-9.4.7.v20170914.jar 
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_162-ea
Main-Class: com.michealyang.jetty.embeded.EmbeddedJettyServer

classpathPrefix: classpath的前綴。如上面的manifest文件中笨枯,Class-Path的值中薪丁,每個(gè)jar包的前綴都是libs/。本質(zhì)上馅精,這個(gè)配置的值是所依賴(lài)jar包所在的文件夾严嗜。配置正確了才能找到依賴(lài)
mainClass: 指定啟動(dòng)時(shí)的Main Class

其次,maven-dependency-plugin會(huì)把所依賴(lài)的jar包c(diǎn)opy到指定目錄

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

executions中的配置都很重要洲敢,按照上面的配置來(lái)就行了漫玄。outputDirectory指定了要將所依賴(lài)的jar包c(diǎn)opy到哪個(gè)目錄。要與maven-jar-plugin中的classpathPrefix一致。

執(zhí)行如下命令睦优,即可打包:

mvn package

打包結(jié)果是渗常,自己寫(xiě)的Class在jar包中,所依賴(lài)的jar包在libs目錄中:

├── embedded-jetty-1.0.0-SNAPSHOT.jar
├── lib
│ ├── jetty-server-9.4.7.v20170914.jar
│ ├── jetty-http-9.4.7.v20170914.jar

執(zhí)行如下命令即可啟動(dòng)jar包:

java -jar embedded-jetty-1.0.0-SNAPSHOT.jar

優(yōu)點(diǎn)
有諸多配置項(xiàng)汗盘,很自由皱碘,每個(gè)步驟都可控

缺點(diǎn)
打成的最終jar包中沒(méi)有所依賴(lài)的jar包。依賴(lài)跟自己的代碼不在一個(gè)jar包中隐孽。部署或者移動(dòng)的時(shí)候癌椿,要考慮到多個(gè)文件,比較麻煩

方法二:使用maven-assembly-plugin (推薦)

maven-assembly-plugin可以將所有的東西都打包到一個(gè)jar包中菱阵。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                <manifest>
                    <mainClass>
                        com.michealyang.jetty.embeded.EmbeddedJettyServer
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

執(zhí)行mvn package后踢俄,會(huì)在target文件夾下生成兩個(gè)jar包,一個(gè)是不帶依賴(lài)的jar包晴及,一個(gè)是后綴有-dependencies帶有依賴(lài)的jar包褪贵,如:

May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar
May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT.jar

啟動(dòng)時(shí),直接執(zhí)行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar

優(yōu)點(diǎn)
所有的東西都打到一個(gè)jar包中抗俄,很方便
缺點(diǎn)
配置項(xiàng)少脆丁,不自由。

方法三:使用maven-shade-plugin

maven-assembly-plugin類(lèi)似动雹,都可以將所有的東西都打包到一個(gè)jar包中槽卫。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <transformers>
                    <transformer implementation=
                      "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.michealyang.jetty.embeded.EmbeddedJettyServer</mainClass>
                </transformer>
            </transformers>
        </configuration>
        </execution>
    </executions>
</plugin>

執(zhí)行mvn package后,會(huì)在target文件夾下生成兩個(gè)jar包胰蝠,一個(gè)是不帶依賴(lài)的jar包歼培,一個(gè)是后綴有-shaded帶有依賴(lài)的jar包,如:

May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT-shaded.jar
May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT.jar

啟動(dòng)時(shí)茸塞,直接執(zhí)行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-shaded.jar

優(yōu)點(diǎn)
功能同maven-assembly-plugin躲庄,但比前者強(qiáng)大
缺點(diǎn)
配置起來(lái)太麻煩。當(dāng)你需要高級(jí)功能的時(shí)候钾虐,更是麻煩的不要不要的噪窘。

方法四:使用onejar-maven-plugin

This provides custom classloader that knows how to load classes and resources from jars inside an archive, instead of from jars in the filesystem.

<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <mainClass>org.baeldung.executable.
                  ExecutableMavenJar</mainClass>
                <attachToBuild>true</attachToBuild>
                <filename>
                  ${project.build.finalName}.${project.packaging}
                </filename>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

優(yōu)點(diǎn)
clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
缺點(diǎn)
not actively supported since 2012

方法五:使用spring-boot-maven-plugin

能同時(shí)打可執(zhí)行jar包和war包
This allows to package executable jar or war archives and run an application “in-place”.

需要maven版本不低于3.2

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>spring-boot</classifier>
                <mainClass>
                  org.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

兩個(gè)重點(diǎn):

  • goal要寫(xiě)成repackage
  • classifier要寫(xiě)成spring-boot

優(yōu)點(diǎn)
dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well

缺點(diǎn)
添加了一些不必要的Spring和Spring Boot依賴(lài)

方法六:使用tomcat7-maven-plugin

可打包成一個(gè)web工程類(lèi)型的jar包。其實(shí)是內(nèi)嵌了一個(gè)tomcat在里面效扫。

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <path>/</path>
                <enableNaming>false</enableNaming>
                <finalName>webapp.jar</finalName>
                <charset>utf-8</charset>
            </configuration>
        </execution>
    </executions>
</plugin>

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

優(yōu)點(diǎn)
只有一個(gè)jar包
缺點(diǎn)
打包出的文件很大倔监。因?yàn)槔锩鎯?nèi)嵌了一個(gè)tomcat

參考

How to Create an Executable JAR with Maven

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菌仁,隨后出現(xiàn)的幾起案子浩习,更是在濱河造成了極大的恐慌,老刑警劉巖济丘,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱秽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疟赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辱士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人听绳,你說(shuō)我怎么就攤上這事颂碘。” “怎么了椅挣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵头岔,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鼠证,道長(zhǎng)峡竣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任量九,我火速辦了婚禮适掰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荠列。我一直安慰自己类浪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布肌似。 她就那樣靜靜地躺著费就,像睡著了一般。 火紅的嫁衣襯著肌膚如雪川队。 梳的紋絲不亂的頭發(fā)上力细,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音固额,去河邊找鬼眠蚂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斗躏,可吹牛的內(nèi)容都是我干的逝慧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瑟捣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馋艺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起迈套,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碱鳞,沒(méi)想到半個(gè)月后桑李,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贵白,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了率拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禁荒,死狀恐怖猬膨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呛伴,我是刑警寧澤勃痴,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站热康,受9級(jí)特大地震影響沛申,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐军,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一铁材、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奕锌,春花似錦著觉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缴守,卻和暖如春葬毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡穗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工贴捡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人村砂。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓烂斋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親础废。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汛骂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容