IDEA打包jar的pom.xml配置

使用IDEA創(chuàng)建spark項(xiàng)目,會(huì)用到 pom.xml的配置,現(xiàn)簡(jiǎn)單做個(gè)記錄。

1. 固定部分

當(dāng)我們創(chuàng)建好項(xiàng)目時(shí),會(huì)默認(rèn)生成pom.xml,其中有部分是不需要我們手動(dòng)更改的:

<?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.example</groupId>
  <artifactId>algorithm_strategy</artifactId>
  <version>1.0</version>
</project>

所有 POM 文件都需要 project 元素和三個(gè)必需字段:groupId,artifactId,version。

節(jié)點(diǎn) 描述
project 工程的根標(biāo)簽。
modelVersion 模型版本需要設(shè)置為 4.0。
groupId 這是工程組的標(biāo)識(shí)。它在一個(gè)組織或者項(xiàng)目中通常是唯一的。例如,一個(gè)銀行組織 com.companyname.project-group 擁有所有的和銀行相關(guān)的項(xiàng)目。
artifactId 這是工程的標(biāo)識(shí)。它通常是工程的名稱。例如,消費(fèi)者銀行。groupId 和 artifactId 一起定義了 artifact 在倉(cāng)庫(kù)中的位置。
version 這是工程的版本號(hào)。在 artifact 的倉(cāng)庫(kù)中,它用來(lái)區(qū)分不同的版本。例如:org.example:consumer-banking:1.0 org.example:consumer-banking:1.1

2. 引用常量定義

接下來(lái)可以為pom定義一些常量,在pom中的其它地方可以直接引用

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <scala.binary.version>2.11</scala.binary.version>
    <spark.version>2.4.4</spark.version>
    <scala.binary.version>2.11</scala.binary.version>
    <scala.version>2.11.12</scala.version>
  </properties>

3. Maven倉(cāng)庫(kù)

運(yùn)行Maven的時(shí)候,Maven所需要的任何構(gòu)件都是直接從本地倉(cāng)庫(kù)獲取的。如果本地倉(cāng)庫(kù)沒(méi)有,它會(huì)首先嘗試從遠(yuǎn)程倉(cāng)庫(kù)下載構(gòu)件至本地倉(cāng)庫(kù),然后再使用本地倉(cāng)庫(kù)的構(gòu)件。

3.1 本地倉(cāng)庫(kù)

Maven缺省的本地倉(cāng)庫(kù)地址為${user.home}/.m2/repository 。一個(gè)用戶會(huì)對(duì)應(yīng)的擁有一個(gè)本地倉(cāng)庫(kù)。

可以自定義本地倉(cāng)庫(kù)的位置,修改 /usr/local/apache-maven-3.6.3/conf/settings.xml 。

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
3.2 Maven中央倉(cāng)庫(kù)

Maven安裝自帶了一個(gè)遠(yuǎn)程倉(cāng)庫(kù)即Maven中央倉(cāng)庫(kù)。具體可在 /usr/local/apache-maven-3.6.3/lib/maven-model-builder-3.6.3.jar文件里的 pom-4.0.0.xml中進(jìn)行查看。它是所有Maven POM的父POM,所有Maven項(xiàng)目繼承該配置。中央倉(cāng)庫(kù)的id為central,遠(yuǎn)程url地址為http://repo.maven.apache.org/maven2,它關(guān)閉了snapshot版本構(gòu)件下載的支持。

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

我們可以在POM中配置其它的遠(yuǎn)程倉(cāng)庫(kù),比如下面的中國(guó)的中央倉(cāng)庫(kù)

<project>
...
  <repositories>
    <repository>
      <id>maven-net-cn</id>
      <name>Maven China Mirror</name>
      <url>http://maven.net.cn/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>maven-net-cn</id>
      <name>Maven China Mirror</name>
      <url>http://maven.net.cn/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>    
    </pluginRepository>
  </pluginRepositories>
...
</project>

我們也可以在<repositories>下面添加多個(gè)<repository>,每個(gè)<repository>都有它唯一的id,一個(gè)描述性的name,以及最重要的,遠(yuǎn)程倉(cāng)庫(kù)的url。此外,<releases><enabled>true</enabled></releases>告訴Maven可以從這個(gè)倉(cāng)庫(kù)下載releases版本的構(gòu)件,而<snapshots><enabled>false</enabled></snapshots>告訴Maven不要從這個(gè)倉(cāng)庫(kù)下載snapshot版本的構(gòu)件。禁止從公共倉(cāng)庫(kù)下載snapshot構(gòu)件是推薦的做法,因?yàn)檫@些構(gòu)件不穩(wěn)定,且不受你控制,你應(yīng)該避免使用。當(dāng)然,如果你想使用局域網(wǎng)內(nèi)組織內(nèi)部的倉(cāng)庫(kù),你可以激活snapshot的支持。至于<pluginRepositories>,這是配置Maven從什么地方下載插件構(gòu)件(Maven的所有實(shí)際行為都由其插件完成)。該元素的內(nèi)部配置和<repository>完全一樣。

在工作中我們一般都是使用公司局域網(wǎng)的遠(yuǎn)程倉(cāng)庫(kù),使用該倉(cāng)庫(kù)能大大提高下載速度,繼而提高構(gòu)建速度。比如我們當(dāng)前的spark項(xiàng)目配置的遠(yuǎn)程倉(cāng)庫(kù)為 (鑒于公司隱私,其中 url被我替換了下)。

  <repositories>

    <repository>
      <id>Central</id>
      <url>http://nexus.org.example/content/repositories/central</url>
    </repository>

    <repository>
      <id>Jcenter</id>
      <url>http://nexus.org.example/content/repositories/Jcenter/</url>
    </repository>

    <repository>
      <id>bili-nexus-release-server</id>
      <url>http://nexus.org.example/content/repositories/releases</url>
    </repository>

    <repository>
      <id>snapshots</id>
      <url>http://nexus.org.example/content/repositories/snapshots</url>
    </repository>

  </repositories>

4. 項(xiàng)目依賴

由于當(dāng)前主要基于 XGBoost,所以主要引入相關(guān)的依賴。需要注意 scope 的參數(shù),這里的值為 provided,是因?yàn)楫?dāng)前的集群環(huán)境提供了這些依賴,所以打包的時(shí)候可以不用一起打包。但是在本地運(yùn)行時(shí)需要將其注釋掉 (此時(shí)為默認(rèn)值:compile)

  <dependencies>
    <!--scala-->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <!-- spark -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.binary.version}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.binary.version}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-mllib_${scala.binary.version}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
    <!-- xgboost -->
    <dependency>
      <groupId>ml.dmlc</groupId>
      <artifactId>xgboost4j-spark_${scala.binary.version}</artifactId>
      <version>1.0.0</version>
      <!--<scope>provided</scope>-->
    </dependency>
  </dependencies>

5. 構(gòu)建插件

打包成 jar 的配置,maven-assembly-pluginmaven-jar-plugin 配合使用,最后就只會(huì)生成一個(gè) xx-jar-with-dependencies.jar。

  <build>
<!--    <sourceDirectory>src/main/scala</sourceDirectory>-->
<!--    <testSourceDirectory>src/test/scala</testSourceDirectory>-->
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
          <args>
            <arg>-target:jvm-1.5</arg>
          </args>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assemble</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>none</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

6. 參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 ??當(dāng)我們使用Maven來(lái)管理和構(gòu)建我們的項(xiàng)目的時(shí)候,我們會(huì)不可避免的遇到pom文件。雖然已經(jīng)配置過(guò)po...
    騎著烏龜去看海閱讀 7,900評(píng)論 1 15
  • <!-- 指定當(dāng)前pom的版本 --> <modelVersion>4.0.0</modelVersion> <!...
    樂(lè)m閱讀 675評(píng)論 0 0
  • Maven 教程Maven 是一個(gè)項(xiàng)目管理工具,可以對(duì) Java 項(xiàng)目進(jìn)行構(gòu)建、依賴管理。 1. maven中的坐...
    loserwang_3030閱讀 280評(píng)論 0 0
  • 可以先看看Maven 那點(diǎn)事兒https://my.oschina.net/huangyong/blog/1945...
    air_b10f閱讀 199評(píng)論 0 0
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 6,037評(píng)論 0 5

友情鏈接更多精彩內(nèi)容