溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

發(fā)布時(shí)間:2020-11-05 15:53:09 來(lái)源:億速云 閱讀:410 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1. 需求

項(xiàng)目打包,滿足以下要求:

1.整個(gè)項(xiàng)目打一個(gè)Zip包下面包括應(yīng)用程序、應(yīng)用程序依賴的jar包、說(shuō)明文檔
2.項(xiàng)目打的jar包可以執(zhí)行不同類里的Main函數(shù)
3.項(xiàng)目源碼打的jar包要與依賴的第三方j(luò)ar包分開(kāi)
4.項(xiàng)目里的執(zhí)行腳本也要一塊打包并進(jìn)行分類
5.document目錄下的readme.txt放在壓縮包的根目錄下,其他的還放在這個(gè)目錄下
6.打的jar包去掉不需要的目錄(文件)

2. 開(kāi)發(fā)環(huán)境

IDEA-2016 Maven3.3.9

項(xiàng)目的目錄結(jié)構(gòu):

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

3. Maven打包插件介紹

assembly翻譯過(guò)來(lái)就是組裝、裝配的意思
Maven對(duì)項(xiàng)目打包常用的打包插件有三種,分別是:

插件功能
maven-jar-pluginmaven 默認(rèn)打包插件,用來(lái)創(chuàng)建 project jar
maven-shade-plugin打可執(zhí)行包,executable(fat) jar
maven-assembly-plugin支持自定義打包方式

這里使用maven-jar-plugin和maven-assembly-plugin
項(xiàng)目目錄:

每次找jar包之前先clean一下,不然的話IDEA會(huì)認(rèn)為你的項(xiàng)目沒(méi)有修改而不重新加載

另:配置文件的注釋已經(jīng)很詳細(xì)了,這里就不另外再說(shuō)明了

4. Maven使用maven-jar-plugin打可執(zhí)行jar包

主要配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.4</version>
  <!-- 對(duì)要打的jar包進(jìn)行配置 -->
  <configuration>
    <!-- Configuration of the archiver -->
    <archive>
      <!--生成的jar中,不要包含pom.xml和pom.properties這兩個(gè)文件-->
      <addMavenDescriptor>false</addMavenDescriptor>

      <!-- Manifest specific configuration -->
      <manifest>
        <!--是否要把第三方j(luò)ar放到manifest的classpath中-->
        <addClasspath>true</addClasspath>
        
        <!--生成的manifest中classpath的前綴,
        因?yàn)橐训谌絡(luò)ar放到lib目錄下,
        所以classpath的前綴是lib/-->
        <classpathPrefix>lib/</classpathPrefix>
      </manifest>
    </archive>
    <!--過(guò)濾掉不希望包含在jar中的文件-->
    <excludes>
      <!-- 排除不需要的文件夾(路徑是jar包內(nèi)部的路徑) -->
      <exclude>**/assembly/</exclude>
    </excludes>
  </configuration>
</plugin>

完整配置見(jiàn)底部

5. Maven使用maven-assembly-plugin裝需要打包的文件打進(jìn)zip包

pom.xml下的主要配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
  <!-- 對(duì)項(xiàng)目的組裝進(jìn)行配置 -->
  <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見(jiàn)底部

6. Maven生成可執(zhí)行jar包及zip項(xiàng)目壓縮包

雙擊執(zhí)行mvn:package會(huì)生成兩個(gè)包:可執(zhí)行jar包和項(xiàng)目壓縮包,因?yàn)閍ssembly的裝配配置的是綁定到這上面來(lái)的
雙擊執(zhí)行assembly:single只生成項(xiàng)目壓縮包

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

這里執(zhí)行mvn:package

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

解壓后的項(xiàng)目壓縮包目錄結(jié)構(gòu):

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

7. 執(zhí)行jar包

解壓縮生成的項(xiàng)目包
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, "---"));
  }
}

命令行運(yùn)行生成的jar

java -classpath dong.jar com.dong.bigdata.TestString
java -classpath dong.jar com.dong.bigdata.TestNumber

運(yùn)行結(jié)果:

使用Maven 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包

8. pom.xml配置

包含兩個(gè)文件:
pom.xml整體的配置
package.xml包含在pom.xml中,用于指定assembly裝配時(shí)的配置

pom.xml文件:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<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>
  <!-- ####################### 基礎(chǔ)設(shè)置 ###################### -->
  <!--groupId:項(xiàng)目或者組織的唯一標(biāo)志,并且配置時(shí)生成路徑也是由此生成,如org.myproject.mojo生成的相對(duì)路徑為:/org/myproject/mojo-->
  <groupId>com.dong</groupId>
  <!--項(xiàng)目的通用名稱-->
  <artifactId>bigdata</artifactId>
  <!--打包機(jī)制,如pom,jar,maven-plugin,ejb,war,ear,rar,par-->
  <packaging>jar</packaging>
  <!--項(xiàng)目的版本-->
  <version>1.0-SNAPSHOT</version>

  <!-- ####################### 項(xiàng)目信息 ###################### -->
  <!--用戶描述項(xiàng)目的名稱,無(wú)關(guān)緊要的東西-->
  <name>bigdata</name>
  <!--寫(xiě)明開(kāi)發(fā)團(tuán)隊(duì)的網(wǎng)站,無(wú)關(guān)緊要-->
  <url>http://http://www.dong.com/.com</url>

  <!-- ####################### 環(huán)境設(shè)置 ###################### -->
  <properties>
    <!-- 項(xiàng)目執(zhí)行腳本目錄 -->
    <project.script.execute.directory>src/main/scripts/execute</project.script.execute.directory>
    <!-- 項(xiàng)目說(shuō)明文檔目錄 -->
    <project.document.directory>document</project.document.directory>
    <!-- 項(xiàng)目配置文件目錄 -->
    <project.config.directory>src/main/resources</project.config.directory>
    <!-- 項(xiàng)目編碼 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- 本地編譯JDK版本 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <!-- 項(xiàng)目部署JDK版本 -->
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <!--
   配置Maven的倉(cāng)庫(kù), 在此處配置的倉(cāng)庫(kù)會(huì)優(yōu)先于setting.xml里配置的倉(cāng)庫(kù),
   建議哪個(gè)倉(cāng)庫(kù)快,哪個(gè)配置在前面, 然后如果Maven在前面配置的倉(cāng)庫(kù)找不到的話會(huì)去后面的倉(cāng)庫(kù)找,
   如果后面的倉(cāng)庫(kù)都找不到,會(huì)去setting.xml中央倉(cāng)庫(kù)里找
   -->
  <repositories>
    <!-- 阿里云倉(cāng)庫(kù),配置Maven倉(cāng)庫(kù),速度快配置在最前面 -->
    <repository>
      <id>aliyun</id>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </repository>
    <!-- 國(guó)內(nèi)備選倉(cāng)庫(kù) -->
    <repository>
      <id>repo2</id>
      <url>http://repo2.maven.org/maven2/</url>
    </repository>

    <!-- Cloudera倉(cāng)庫(kù),如果在阿里云倉(cāng)庫(kù)里找不到去Cloudera的倉(cāng)庫(kù)里找,主要是CDH版本Hadoop依賴的jar -->
    <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>

    <!-- Scala倉(cāng)庫(kù),如果前面兩個(gè)都找不到來(lái)倉(cāng)庫(kù)找,如果此倉(cāng)庫(kù)也找不到,去中央倉(cāng)庫(kù)找 -->
    <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>
        <!-- 對(duì)要打的jar包進(jìn)行配置 -->
        <configuration>
          <!-- Configuration of the archiver -->
          <archive>
            <!--生成的jar中,不要包含pom.xml和pom.properties這兩個(gè)文件-->
            <addMavenDescriptor>false</addMavenDescriptor>

            <!-- Manifest specific configuration -->
            <manifest>
              <!--是否要把第三方j(luò)ar放到manifest的classpath中-->
              <addClasspath>true</addClasspath>

              <!--
              生成的manifest中classpath的前綴,
              因?yàn)橐训谌絡(luò)ar放到lib目錄下,
              所以classpath的前綴是lib/
              -->
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
          </archive>
          <!--過(guò)濾掉不希望包含在jar中的文件-->
          <excludes>
            <!-- 排除不需要的文件夾(路徑是jar包內(nèi)部的路徑) -->
            <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>
        <!-- 對(duì)項(xiàng)目的組裝進(jìn)行配置 -->
        <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文件

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<assembly>
  <id>full</id>
  <!-- 最終打包成一個(gè)用于發(fā)布的zip文件 -->
  <formats>
    <format>zip</format>
  </formats>

  <!-- 把依賴jar包打包進(jìn)Zip壓縮文件的lib目錄下 -->
  <dependencySets>
    <dependencySet>
      <!--不使用項(xiàng)目的artifact,第三方j(luò)ar不要解壓,打包進(jìn)zip文件的lib目錄-->
      <useProjectArtifact>false</useProjectArtifact>

      <!-- 第三方j(luò)ar打包進(jìn)Zip文件的lib目錄下, -->
      <!-- 注意此目錄要與maven-jar-plugin中classpathPrefix指定的目錄相同, -->
      <!-- 不然這些依賴的jar包加載到ClassPath的時(shí)候會(huì)找不到-->
      <outputDirectory>lib</outputDirectory>

      <!-- 第三方j(luò)ar不要解壓-->
      <!--<unpack>false</unpack>-->
    </dependencySet>
  </dependencySets>

  <!-- 文件設(shè)置,你想把哪些文件包含進(jìn)去,或者把某些文件排除掉,都是在這里配置-->
  <fileSets>
    <!-- 把項(xiàng)目自己編譯出來(lái)的可執(zhí)行jar,打包進(jìn)zip文件的根目錄 -->
    <fileSet>
      <directory>${project.build.directory}</directory>
      <outputDirectory></outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>

    <!--
    把項(xiàng)目readme說(shuō)明文檔,打包進(jìn)zip文件根目錄下
    (這里針對(duì)目錄document/readme.txt文件)
    ${projet.document.directory}是pom.xml中自己配置的
     -->
    <fileSet>
      <directoryl>${projet.document.directory}</directoryl>
      <outputDirectory></outputDirectory>
      <includes>
        <include>readme.*</include>
      </includes>
    </fileSet>

    <!--
    把項(xiàng)目相關(guān)的說(shuō)明文檔(除了readme文檔),
    打包進(jìn)zip文件根目錄下的document目錄
    (這里針對(duì)document/exclode.txt文件)
    ${project.document.directory}是在pom.xml中自己配置的
    -->
    <fileSet>
      <directory>${project.document.directory}</directory>
      <outputDirectory>document</outputDirectory>
      <excludes>
        <exclude>readme.*</exclude>
      </excludes>
    </fileSet>

    <!--
    把項(xiàng)目的腳本文件目錄(src/main/scripts )中的啟動(dòng)腳本文件,
    打包進(jìn)zip文件的根目錄
    (這里針對(duì)的是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 實(shí)現(xiàn)打包生成一個(gè)可執(zhí)行jar包了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI