開發(fā)JAVA工程代碼(main方法啟動(dòng))如何構(gòu)建出可以通過(guò)java -jar命令直接執(zhí)行的jar?如果工程中依賴其他jar又如何處理?本文即針對(duì)以上兩點(diǎn)通過(guò)IDEA開發(fā)工具來(lái)做一個(gè)簡(jiǎn)單的分析和嘗試,測(cè)試如下四種方法,如有瑕疵請(qǐng)輕噴。
1.通過(guò)IDEA直接構(gòu)建可執(zhí)行jar
如下所示通過(guò)IDEA創(chuàng)建一個(gè)本地JAVA工程,此處工程名JavaPackage1,在lib引入一個(gè)hutool-all-5.3.7.jar作為測(cè)試,目錄結(jié)構(gòu)如下點(diǎn)擊運(yùn)行JPackage1正常打印日期。
如何通過(guò)IDEA直接構(gòu)建可執(zhí)行jar呢?具體步驟如下:
-
選擇File -> Project Structure
-
選擇Arifacts->ADD->JAR->Form modules with dependencies
-
在Main Class欄選擇要打包成jar文件的java類,點(diǎn)擊OK
-
出現(xiàn)如下界面,點(diǎn)擊ok。最后構(gòu)建完成jar的啟動(dòng)相關(guān)信息會(huì)寫入到META-INF/MANIFEST.MF清單文件中。
-
點(diǎn)擊Build->Build Artifacts,參照以下兩張圖,最后在\out\artifacts\目錄下生成j可執(zhí)行ar文件
-
最后通過(guò)在cmd窗口直接執(zhí)行java -jar JavaPackage1.jar 運(yùn)行正常輸出hutool工具類獲取的日期
后續(xù)若修改代碼后可直接執(zhí)行Build->Build Artifacts生成jar,不需要再做前面的配置步驟。同時(shí)解壓該生成的jar可以發(fā)現(xiàn)依賴的hutool工具類是以class文件全部打入進(jìn)來(lái)了。其中生成的MANIFEST.MF文件很簡(jiǎn)單就指明了Main-Class啟動(dòng)類信息。
2.通過(guò)ANT構(gòu)建可執(zhí)行jar
- IDEA新建JAVA工程,此處新建工程名JavaPackage2,并在lib下引入hutool依賴jar
- 在項(xiàng)目根目錄下編寫ant.xml(文件名無(wú)要求)
xml中內(nèi)容如下,具體語(yǔ)法可參考官網(wǎng)學(xué)習(xí)
<?xml version="1.0" encoding="UTF8"?>
<project name="buildJar" default="jar" basedir=".">
<tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp>
<!-- 定義:打包生成的jar的名字 -->
<property name="jar.name" value="JavaPackage2.jar"/>
<!-- 定義:主類路徑 -->
<property name="main.class" value="com.xren.jpackage2.JPackage2"/>
<property name="build.dir" value="${basedir}/build" />
<property name="classes.dir" value="${basedir}/classes" />
<property name="lib.dir" value="${basedir}/lib" />
<!--階段1.刪除之前生成的jar包-->
<target name="clean">
<delete dir="${build.dir}"/>
<delete dir="${classes.dir}"/>
</target>
<!--定義依賴jar路徑-->
<path id="lib.path">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<!--階段2.編譯java文件-->
<target name="compile" depends="clean">
<!--創(chuàng)建classes文件夾-->
<mkdir dir="${classes.dir}"/>
<!--編譯java文件-->
<javac srcdir="${basedir}/src" destdir="${classes.dir}" encoding="UTF8">
<!--編譯依賴jar -->
<classpath refid="lib.path"/>
</javac>
</target>
<!--階段3.生成可運(yùn)行的jar包-->
<pathconvert property="relate.classpath" pathsep=" ">
<mapper>
<chainedmapper>
<flattenmapper />
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path refid="lib.path" />
</pathconvert>
<target name="jar" depends="compile">
<mkdir dir="${build.dir}"/>
<!--指定清單文件 -->
<manifest file="${build.dir}/MANIFEST.MF">
<!--主類路徑-->
<attribute name="Main-class" value="${main.class}"/>
<!-- 引入依賴jar-classpath -->
<attribute name="Class-Path" value="${relate.classpath}" />
<attribute name="Built-Date" value="${TODAY}" />
</manifest>
<jar destfile="${build.dir}/${jar.name}"
basedir="${classes.dir}"
manifest="${build.dir}/MANIFEST.MF">
</jar>
<!--拷貝依賴jar到當(dāng)前build目錄 -->
<copy todir="${build.dir}/lib" >
<fileset dir="${lib.dir}"></fileset>
</copy>
</target>
</project>
- 添加ant.xml文件
- 選中buildJar、點(diǎn)擊執(zhí)行,而后便會(huì)在build目錄下生成一個(gè)可執(zhí)行的jar
- 執(zhí)行效果如下
此方式生成的jar需要和同級(jí)目錄下的lib依賴引入才能運(yùn)行成功,原因是在ant.xml文件中打包時(shí)已經(jīng)在清單文件MANIFEST.MF里固定了lib路徑。
如果想將外部的jar全部打入到j(luò)ar中,需要在xml中做如下單獨(dú)引入,最后jar可直接運(yùn)行。xml配置及包結(jié)構(gòu)如下:
<target name="jar" depends="compile">
<mkdir dir="${build.dir}"/>
<!--指定清單文件 -->
<manifest file="${build.dir}/MANIFEST.MF">
<!--主類路徑-->
<attribute name="Main-class" value="${main.class}"/>
</manifest>
<jar destfile="${build.dir}/${jar.name}"
basedir="${classes.dir}"
manifest="${build.dir}/MANIFEST.MF">
<zipfileset src="${lib.dir}/hutool-all-5.3.7.jar"/>
</jar>
</target>
3.通過(guò)maven-assembly插件構(gòu)建可執(zhí)行jar
- 新建Java-maven工程,通過(guò)pom引入hutool工具庫(kù)依賴,此處新建工程名JavaPackage3
pom.xml配置
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>
</dependencies>
如果hutool-all.jar依賴下載不了請(qǐng)檢查IDEA的maven配置是否正確。
- Pom中引入maven-assembly-plugin插件打包
<build>
<plugins>
<!-- 使用maven-assembly-plugin插件打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<!--主類 -->
<mainClass>com.xren.jpackage3.JPackage3</mainClass>
</manifest>
</archive>
<descriptorRefs>
<!-- 可執(zhí)行jar名稱結(jié)尾-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 執(zhí)行maven-package,而后在target目錄下會(huì)生成一個(gè)以jar-with-dependencies結(jié)尾的可直接執(zhí)行jar,另外一個(gè)jar里面沒(méi)有依賴不可執(zhí)行
- 該可執(zhí)行jar的目錄結(jié)構(gòu)和清單文件MANIFEST.MF內(nèi)容如下
通過(guò)Maven-assembly插件構(gòu)建的jar和ant構(gòu)建出來(lái)的jar中結(jié)構(gòu)基本一致,將依賴jar以class方式加入內(nèi)容部,同時(shí)在打包配置文件中指定清單文件MANIFEST.MF的主啟動(dòng)類Main-Class。
4.通過(guò)maven-shade插件構(gòu)建可執(zhí)行jar
- 新建Java-maven工程,通過(guò)pom引入hutool工具庫(kù)依賴,此處新建工程名JavaPackage4
- Pom文件中引入maven-shade-plugin插件
<build>
<plugins>
<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>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xren.jpackage4.JPackage4</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 執(zhí)行maven package,而后會(huì)在target目錄下生成一個(gè)可執(zhí)行JavaPackage4-1.0-SNAPSHOT.jar
- 執(zhí)行該jar,正常運(yùn)行
利用maven-shade-plugin構(gòu)建除了會(huì)生成可執(zhí)行jar,還會(huì)在target目錄下生成一個(gè)以original-開頭的原始jar,該jar不可執(zhí)行內(nèi)部沒(méi)有依賴其他,其清單文件MANIFEST.MF如下:
而可執(zhí)行jar清單文件如下,差別就是多了一個(gè)Main-Class文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-756607.html
**總結(jié):**綜上幾種構(gòu)建可執(zhí)行jar的方式可知,其都有一個(gè)共同點(diǎn)-jar里面有一個(gè)包含Main-Class的MANIFEST.MF文件,Main-Class配置指向main方法的主啟動(dòng)類。jar依賴的其他程序會(huì)以lib-jar或者class文件的方式包含其中(此文只驗(yàn)證依賴jar,沒(méi)有驗(yàn)證配置文件依賴)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756607.html
到了這里,關(guān)于JAVA項(xiàng)目通過(guò)IDEA如何構(gòu)建可執(zhí)行JAR的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!