如何使用 Maven 配置您的项目

本指南将向您展示如何使用 Maven 配置 Flink 作业项目,Maven是 由 Apache Software Foundation 开源的自动化构建工具,使您能够构建、发布和部署项目。您可以使用它来管理软件项目的整个生命周期。

要求

  • Maven 3.8.6
  • Java 8 (deprecated) or Java 11

将项目导入 IDE

创建项目目录和文件后,我们建议您将此项目导入到 IDE 进行开发和测试。

IntelliJ IDEA 支持开箱即用的 Maven 项目。Eclipse 提供了 m2e 插件导入 Maven 项目

注意: Java 的默认 JVM 堆大小对于 Flink 来说可能太小,您应该手动增加它。在 Eclipse 中,选中 Run Configurations -> Arguments 并在 VM Arguments 框里填上:-Xmx800m。在 IntelliJ IDEA 中,推荐选中 Help | Edit Custom VM Options 菜单修改 JVM 属性。详情请查阅本文

关于 IntelliJ 的注意事项: 要使应用程序在 IntelliJ IDEA 中运行,需要在运行配置中的 Include dependencies with “Provided” scope打勾。如果此选项不可用(可能是由于使用了较旧的 IntelliJ IDEA 版本),可创建一个调用应用程序main()` 方法的测试用例。

构建项目

如果您想 构建/打包 您的项目,请转到您的项目目录并运行 ‘mvn clean package’ 命令。您将 找到一个 JAR 文件,其中包含您的应用程序(还有已作为依赖项添加到应用程序的连接器和库):target/<artifact-id>-<version>.jar

注意: 如果您使用不同于 DataStreamJob 的类作为应用程序的主类/入口点,我们建议您对 pom.xml 文件里的 mainClassName 配置进行相应的修改。这样,Flink 可以通过 JAR 文件运行应用程序,而无需额外指定主类。

向项目添加依赖项

打开您项目目录的 pom.xml,在 dependencies 标签内添加依赖项。

例如,您可以用如下方式添加 Kafka 连接器依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.flink</groupId>
  4. <artifactId>flink-connector-kafka</artifactId>
  5. <version>1.20.0</version>
  6. </dependency>
  7. </dependencies>

然后在命令行执行 mvn install

当您在由 Java Project TemplateScala Project Template 或 Gradle 创建出来的项目里,运行 mvn clean package 会自动将应用程序依赖打包进应用程序 JAR。对于不是通过这些模板创建的项目,我们建议使用 Maven Shade 插件以将所有必需的依赖项打包进应用程序 jar。

重要提示: 请注意,应将所有这些(核心)依赖项的生效范围置为 provided。这意味着需要对它们进行编译,但不应将它们打包进项目生成的应用程序 JAR 文件中。如果不设置为 provided,最好的情况是生成的 JAR 变得过大,因为它还包含所有 Flink 核心依赖项。最坏的情况是添加到应用程序 JAR 文件中的 Flink 核心依赖项与您自己的一些依赖项的版本冲突(通常通过反向类加载来避免)。

要将依赖项正确地打包进应用程序 JAR 中,必须把应用程序依赖项的生效范围设置为 compile

打包应用程序

在部署应用到 Flink 环境之前,您需要根据使用场景用不同的方式打包 Flink 应用程序。

如果您想为 Flink 作业创建 JAR 并且只使用 Flink 依赖而不使用任何第三方依赖(比如使用 JSON 格式的文件系统连接器),您不需要创建一个 uber/fat JAR 或将任何依赖打进包。

如果您想为 Flink 作业创建 JAR 并使用未内置在 Flink 发行版中的外部依赖项,您可以将它们添加到发行版的类路径中,或者将它们打包进您的 uber/fat 应用程序 JAR 中。

您可以将生成的 uber/fat JAR 提交到本地或远程集群:

  1. bin/flink run -c org.example.MyJob myFatJar.jar

要了解有关如何部署 Flink 作业的更多信息,请查看部署指南

创建包含依赖项的 uber/fat JAR 的模板

为构建一个包含所有必需的连接器、 类库依赖项的应用程序 JAR,您可以使用如下 shade 插件定义:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-shade-plugin</artifactId>
  6. <version>3.1.1</version>
  7. <executions>
  8. <execution>
  9. <phase>package</phase>
  10. <goals>
  11. <goal>shade</goal>
  12. </goals>
  13. <configuration>
  14. <artifactSet>
  15. <excludes>
  16. <exclude>com.google.code.findbugs:jsr305</exclude>
  17. </excludes>
  18. </artifactSet>
  19. <filters>
  20. <filter>
  21. <!-- Do not copy the signatures in the META-INF folder.
  22. Otherwise, this might cause SecurityExceptions when using the JAR. -->
  23. <artifact>*:*</artifact>
  24. <excludes>
  25. <exclude>META-INF/*.SF</exclude>
  26. <exclude>META-INF/*.DSA</exclude>
  27. <exclude>META-INF/*.RSA</exclude>
  28. </excludes>
  29. </filter>
  30. </filters>
  31. <transformers>
  32. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  33. <!-- Replace this with the main class of your job -->
  34. <mainClass>my.programs.main.clazz</mainClass>
  35. </transformer>
  36. <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
  37. </transformers>
  38. </configuration>
  39. </execution>
  40. </executions>
  41. </plugin>
  42. </plugins>
  43. </build>

Maven shade 插件 默认会包含所有的生效范围是 “runtime” 或 “compile” 的依赖项。