项目自动化构建工具Maven笔记汇总

2021-10-26  本文已影响0人  井底蛙蛙呱呱呱

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 比较

上一篇下一篇

猜你喜欢

热点阅读