詳解Maven打包和運(yùn)行
將項(xiàng)目進(jìn)行編譯、測(cè)試之后,接下來(lái)就是打包(package),我們的pom.xml中沒(méi)有指定打包類型,那么使用默認(rèn)打包類型jar,簡(jiǎn)單的執(zhí)行命令mvn clean package進(jìn)行打包


從輸出內(nèi)容可以看出,Maven在打包之前進(jìn)行了編譯、測(cè)試等操作。
jar任務(wù)負(fù)責(zé)打包,實(shí)際上就是jar插件的jar目標(biāo)將項(xiàng)目主代碼打包成一個(gè)名為hello-world-1.0-SNAPSHOT.jar的文件。該文件也位于target/輸出目錄中

它是根據(jù)artifact-version.jar規(guī)則進(jìn)行命名的。
至此,我們得到了項(xiàng)目的輸出,如果有需要的話,就可以復(fù)制這個(gè)jar文件到其他項(xiàng)目的Classpath中,從而使用HelloWorld類。
但是,如何讓其他的Maven項(xiàng)目直接飲用這個(gè)jar呢,還需要一個(gè)安裝步驟:mvn clean install

在打包之后,又執(zhí)行了install。從輸出中可以看到該任務(wù)將項(xiàng)目輸出的jar安裝到了Maven本地倉(cāng)庫(kù)中,可以打開(kāi)相應(yīng)的文件夾看到HelloWorld項(xiàng)目的pom和jar。

現(xiàn)在我們已經(jīng)介紹了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。
執(zhí)行test之前是會(huì)先執(zhí)行compile的,執(zhí)行package之前是會(huì)先執(zhí)行test的,類似的install之前會(huì)先執(zhí)行package,可以在任何一個(gè)Maven項(xiàng)目中執(zhí)行這些命令。
默認(rèn)打包生成的jar是不能夠直接運(yùn)行的,因?yàn)閹в衜ain方法的類信息不會(huì)添加到manifest中(打開(kāi)jar文件中的META-INF/MANIFEST.MF文件,將無(wú)法看到Main-Class一行)

為了生成可執(zhí)行的jar文件,需要借助maven-shade-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
這里配置了mainClass為com.juvenxu.mvnbook.helloworld.HelloWorld,項(xiàng)目打包時(shí)會(huì)將該信息放到MANIFEST中,再次執(zhí)行mvn clean install,構(gòu)建完之后打開(kāi)target/目錄,可以看到hello-world-0.0.1-SNAPSHOT.jar和original-hello-world-0.0.1-SNAPSHOT.jar,前者是帶有Main-Class信息的可運(yùn)行jar,后者是原始的jar

打開(kāi)hello-world-0.0.1-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到包含這樣一樣信息:
Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld

現(xiàn)在在項(xiàng)目根目錄中執(zhí)行該jar文件
# java -jar target\hello-world-0.0.1-SNAPSHOT.jar
控制臺(tái)輸出了Hello Maven

到此這篇關(guān)于Maven打包和運(yùn)行的文章就介紹到這了,更多相關(guān)Maven打包和運(yùn)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
各種格式的編碼解碼工具類分享(hex解碼 base64編碼)
這篇文章主要介紹了各種格式的編碼解碼工具類,集成Commons-Codec、Commons-Lang及JDK提供的編解碼方法2014-01-01
SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解
在日常的接口開(kāi)發(fā)中,為了防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,經(jīng)常需要對(duì)接口的參數(shù)進(jìn)行校驗(yàn)。本文通過(guò)示例詳細(xì)講解了SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的,感興趣的可以學(xué)習(xí)一下2022-04-04
Java實(shí)現(xiàn)本地文件批量重命名的示例代碼
本文主要介紹了Java實(shí)現(xiàn)本地文件批量重命名的示例代碼,主要步驟為獲取指定目錄下的所有文件,對(duì)每個(gè)文件進(jìn)行修改,將修改后的文件名賦給該文件,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Spring注解開(kāi)發(fā)@Bean和@ComponentScan使用案例
這篇文章主要介紹了Spring注解開(kāi)發(fā)@Bean和@ComponentScan使用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決
這篇文章主要介紹了關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
springboot項(xiàng)目配置context path失效的問(wèn)題解決
本文主要介紹了springboot項(xiàng)目配置context path失效的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程
這篇文章主要為大家介紹了RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
springboot項(xiàng)目打docker鏡像實(shí)例(入門級(jí))
最近做個(gè)項(xiàng)目,我們想把自己的程序打包成鏡像,并運(yùn)行在docker容器中,本文主要介紹了springboot項(xiàng)目打docker鏡像實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
利用Postman和Chrome的開(kāi)發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目)
這篇文章主要介紹了利用Postman和Chrome的開(kāi)發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

