您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關使用Maven 實現打包生成一個可執行jar包,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1. 需求
項目打包,滿足以下要求:
1.整個項目打一個Zip包下面包括應用程序、應用程序依賴的jar包、說明文檔
2.項目打的jar包可以執行不同類里的Main函數
3.項目源碼打的jar包要與依賴的第三方jar包分開
4.項目里的執行腳本也要一塊打包并進行分類
5.document目錄下的readme.txt放在壓縮包的根目錄下,其他的還放在這個目錄下
6.打的jar包去掉不需要的目錄(文件)
2. 開發環境
IDEA-2016 Maven3.3.9
項目的目錄結構:
3. Maven打包插件介紹
assembly翻譯過來就是組裝、裝配的意思
Maven對項目打包常用的打包插件有三種,分別是:
插件 | 功能 |
---|---|
maven-jar-plugin | maven 默認打包插件,用來創建 project jar |
maven-shade-plugin | 打可執行包,executable(fat) jar |
maven-assembly-plugin | 支持自定義打包方式 |
這里使用maven-jar-plugin和maven-assembly-plugin
項目目錄:
每次找jar包之前先clean一下,不然的話IDEA會認為你的項目沒有修改而不重新加載
另:配置文件的注釋已經很詳細了,這里就不另外再說明了
4. Maven使用maven-jar-plugin打可執行jar包
主要配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- 對要打的jar包進行配置 --> <configuration> <!-- Configuration of the archiver --> <archive> <!--生成的jar中,不要包含pom.xml和pom.properties這兩個文件--> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest specific configuration --> <manifest> <!--是否要把第三方jar放到manifest的classpath中--> <addClasspath>true</addClasspath> <!--生成的manifest中classpath的前綴, 因為要把第三方jar放到lib目錄下, 所以classpath的前綴是lib/--> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!--過濾掉不希望包含在jar中的文件--> <excludes> <!-- 排除不需要的文件夾(路徑是jar包內部的路徑) --> <exclude>**/assembly/</exclude> </excludes> </configuration> </plugin>
完整配置見底部
5. Maven使用maven-assembly-plugin裝需要打包的文件打進zip包
pom.xml下的主要配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <!-- 對項目的組裝進行配置 --> <configuration> <!-- 指定assembly插件的配置文件所在位置 --> <descriptors> <descriptor>src/main/resources/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <!-- 將組裝綁定到maven生命周期的哪一階段 --> <phase>package</phase> <goals> <!-- 指定assembly插件的打包方式--> <goal>single</goal> </goals> </execution> </executions> </plugin>
assembly插件的配置文件package.xml見底部
6. Maven生成可執行jar包及zip項目壓縮包
雙擊執行mvn:package會生成兩個包:可執行jar包和項目壓縮包,因為assembly的裝配配置的是綁定到這上面來的
雙擊執行assembly:single只生成項目壓縮包
這里執行mvn:package
解壓后的項目壓縮包目錄結構:
7. 執行jar包
解壓縮生成的項目包
TestString的源碼:
public class TestString { public static void main(String[] args) { String[] arr = new String[]{"aaa", "bbb", "ccc", "DDD", "EEE", "FFF"}; System.out.println(StringUtils.join(arr, "---")); } }
TestNumber的源碼:
public class TestNumber { public static void main(String[] args) { Integer[] arr = new Integer[]{11, 22, 33, 44, 55, 66}; System.out.println(StringUtils.join(arr, "---")); } }
命令行運行生成的jar
java -classpath dong.jar com.dong.bigdata.TestString java -classpath dong.jar com.dong.bigdata.TestNumber
運行結果:
8. pom.xml配置
包含兩個文件:
pom.xml整體的配置
package.xml包含在pom.xml中,用于指定assembly裝配時的配置
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- ####################### 基礎設置 ###################### --> <!--groupId:項目或者組織的唯一標志,并且配置時生成路徑也是由此生成,如org.myproject.mojo生成的相對路徑為:/org/myproject/mojo--> <groupId>com.dong</groupId> <!--項目的通用名稱--> <artifactId>bigdata</artifactId> <!--打包機制,如pom,jar,maven-plugin,ejb,war,ear,rar,par--> <packaging>jar</packaging> <!--項目的版本--> <version>1.0-SNAPSHOT</version> <!-- ####################### 項目信息 ###################### --> <!--用戶描述項目的名稱,無關緊要的東西--> <name>bigdata</name> <!--寫明開發團隊的網站,無關緊要--> <url>http://http://www.dong.com/.com</url> <!-- ####################### 環境設置 ###################### --> <properties> <!-- 項目執行腳本目錄 --> <project.script.execute.directory>src/main/scripts/execute</project.script.execute.directory> <!-- 項目說明文檔目錄 --> <project.document.directory>document</project.document.directory> <!-- 項目配置文件目錄 --> <project.config.directory>src/main/resources</project.config.directory> <!-- 項目編碼 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 本地編譯JDK版本 --> <maven.compiler.source>1.8</maven.compiler.source> <!-- 項目部署JDK版本 --> <maven.compiler.target>1.8</maven.compiler.target> </properties> <!-- 配置Maven的倉庫, 在此處配置的倉庫會優先于setting.xml里配置的倉庫, 建議哪個倉庫快,哪個配置在前面, 然后如果Maven在前面配置的倉庫找不到的話會去后面的倉庫找, 如果后面的倉庫都找不到,會去setting.xml中央倉庫里找 --> <repositories> <!-- 阿里云倉庫,配置Maven倉庫,速度快配置在最前面 --> <repository> <id>aliyun</id> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> <!-- 國內備選倉庫 --> <repository> <id>repo2</id> <url>http://repo2.maven.org/maven2/</url> </repository> <!-- Cloudera倉庫,如果在阿里云倉庫里找不到去Cloudera的倉庫里找,主要是CDH版本Hadoop依賴的jar --> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> <!-- Scala倉庫,如果前面兩個都找不到來倉庫找,如果此倉庫也找不到,去中央倉庫找 --> <repository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </repository> </repositories> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies> <build> <finalName>dong</finalName> <plugins> <!-- The configuration of maven-jar-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- 對要打的jar包進行配置 --> <configuration> <!-- Configuration of the archiver --> <archive> <!--生成的jar中,不要包含pom.xml和pom.properties這兩個文件--> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest specific configuration --> <manifest> <!--是否要把第三方jar放到manifest的classpath中--> <addClasspath>true</addClasspath> <!-- 生成的manifest中classpath的前綴, 因為要把第三方jar放到lib目錄下, 所以classpath的前綴是lib/ --> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!--過濾掉不希望包含在jar中的文件--> <excludes> <!-- 排除不需要的文件夾(路徑是jar包內部的路徑) --> <exclude>**/assembly/</exclude> </excludes> </configuration> </plugin> <!-- The configuration of maven-assembly-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <!-- 對項目的組裝進行配置 --> <configuration> <!-- 指定assembly插件的配置文件所在位置 --> <descriptors> <descriptor>src/main/resources/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <!-- 將組裝綁定到maven生命周期的哪一階段 --> <!--<phase>package</phase>--> <goals> <!-- 指定assembly插件的打包方式--> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
9. package.xml文件
<?xml version="1.0" encoding="UTF-8"?> <assembly> <id>full</id> <!-- 最終打包成一個用于發布的zip文件 --> <formats> <format>zip</format> </formats> <!-- 把依賴jar包打包進Zip壓縮文件的lib目錄下 --> <dependencySets> <dependencySet> <!--不使用項目的artifact,第三方jar不要解壓,打包進zip文件的lib目錄--> <useProjectArtifact>false</useProjectArtifact> <!-- 第三方jar打包進Zip文件的lib目錄下, --> <!-- 注意此目錄要與maven-jar-plugin中classpathPrefix指定的目錄相同, --> <!-- 不然這些依賴的jar包加載到ClassPath的時候會找不到--> <outputDirectory>lib</outputDirectory> <!-- 第三方jar不要解壓--> <!--<unpack>false</unpack>--> </dependencySet> </dependencySets> <!-- 文件設置,你想把哪些文件包含進去,或者把某些文件排除掉,都是在這里配置--> <fileSets> <!-- 把項目自己編譯出來的可執行jar,打包進zip文件的根目錄 --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory></outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <!-- 把項目readme說明文檔,打包進zip文件根目錄下 (這里針對目錄document/readme.txt文件) ${projet.document.directory}是pom.xml中自己配置的 --> <fileSet> <directoryl>${projet.document.directory}</directoryl> <outputDirectory></outputDirectory> <includes> <include>readme.*</include> </includes> </fileSet> <!-- 把項目相關的說明文檔(除了readme文檔), 打包進zip文件根目錄下的document目錄 (這里針對document/exclode.txt文件) ${project.document.directory}是在pom.xml中自己配置的 --> <fileSet> <directory>${project.document.directory}</directory> <outputDirectory>document</outputDirectory> <excludes> <exclude>readme.*</exclude> </excludes> </fileSet> <!-- 把項目的腳本文件目錄(src/main/scripts )中的啟動腳本文件, 打包進zip文件的根目錄 (這里針對的是src/scripts/execute/include-file.sh文件) ${project.script.execute.directory} --> <fileSet> <directory>${project.script.execute.directory}</directory> <outputDirectory></outputDirectory> <includes> <include>*</include> </includes> </fileSet> </fileSets> </assembly>
上述就是小編為大家分享的使用Maven 實現打包生成一個可執行jar包了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。