Project Object Model(POM):项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
面试官问我maven package和install的区别
将jar文件加到Maven的local repository中
maven菜鸟笔记
问题汇总
plugin maven assembly plugin not found intellij
在maven settings中勾选Use plugin registry
:
对于maven插件飘红解决有效。
将自己的库放在maven默认库中,使得maven可以默认查找此库
配置scala-spark maven项目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:公司或组织的域名倒序+当前项目名称。当前项目名称也即你的全部代码的上一层目录名称 <-->
<groupId>org.example</groupId>
<!--> artifactId:当前项目的模块名称,也可以简单设置为当前项目的top目录名称, 也可以自己定义名字 <-->
<artifactId>project2</artifactId>
<!--> version:当前模块的版本 <-->
<version>1.0-SNAPSHOT</version>
<!--> 如何通过坐标到仓库中查找 jar 包?将上面三个变量连起来:org.example+project2+1.0-SNAPSHOT <-->
<!--> 以连起来的字符串作为目录结构到仓库中查找: org/example/project2/1.0-SNAPSHOT/preject2-1.0-SNAPSHOT.jar <-->
<!--> 如果我们直接打包(mvn clean package)的话,则会生成 preject2-1.0-SNAPSHOT.jar 包 <-->
<!--> 统一管理所依赖 jar 包的版本,对同一个框架的一组 jar 包最好使用相同的版本。
为了方便升级框架,可以将 jar 包的版本信息统一提取出来。后面在依赖dependency中则会自动进行变量替换 <-->
<properties>
<java.version>1.8</java.version>
<scala.version>2.12.10</scala.version>
<scala.main.version>2.12</scala.main.version>
<spark.version>2.4.0</spark.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--> 添加依赖库及其版本 <-->
<!--> 依赖库也是通过 groupId-artifactId-version 来确定 <-->
<!--> 此外,还可以添加scope和exclusion相关配置 <-->
<dependencies>
<dependency>
<!--> 添加scala版本依赖 <-->
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<!--> 这里的scala版本使用的是前面统一设置的scala版本 <-->
<version>${scala.version}</version>
<!--> 配置该库仅在编译测试时有效(某些库可能在部署环境中已安装,因此不必打包进去) <-->
<scope>provided</scope>
</dependency>
<dependency>
<!--> 添加spark库 <-->
<groupId>org.apache.spark</groupId>
<!--> 设置依赖的spark模块 <-->
<artifactId>spark-mllib_${scala.main.version}</artifactId>
<!--> 设置该模块版本 <-->
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.main.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
<!--如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当 前工程,
但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除 <-->
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<exclusion>
<artifactId>snappy-java</artifactId>
<groupId>org.xerial.snappy</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.main.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>snappy-java</artifactId>
<groupId>org.xerial.snappy</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.typesafe/config -->
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.3.2</version>
</dependency>
<!-- tensorflow -->
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>spark-tensorflow-connector_2.11</artifactId>
<version>1.15.0</version>
</dependency>
</dependencies>
<!--构建项目需要的信息 -->
<build>
<!-- sourceDirectory设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径 -->
<sourceDirectory>src/main/scala</sourceDirectory>
<!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<testSourceDirectory>src/test/scala</testSourceDirectory>
<!-- 插件列表 -->
<plugins>
<plugin>
<!-- 该插件用来让maven能够编译、测试、运行scala项目的 -->
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
<plugin>
<!-- 打包插件, 有两个 maven-assembly-plugin 和 maven-shade-plugin, 目前网上大都比较推荐maven-shade-plugin -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--发现依赖和扩展的远程仓库列表 -->
<repositories>
<repository>
<id>repository.xx.com</id>
<name>xx Repository</name>
<url>http://maven.xx.virtual/a/repository</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>xx-internal-repo</id>
<name>xx Internal</name>
<url>http://maven.xx.virtual/a/repository</url>
</pluginRepository>
</pluginRepositories>
</project>
参考:
https://github.com/wzhe06/SparrowRecSys/blob/master/pom.xml
https://github.com/martinprobson/Spark-Scala-Maven-Example/blob/master/pom.xml
maven-assembly-plugin 和 maven-shade-plugin 比较
网友评论