关联不包含于发行版的模块

二进制发行版的 jar 包包含于lib文件夹中,这些 jar 包会自行加入你的 分布式程序的 classpath 中。除了少数例外,几乎所有 Flink 的类都可以在那里找到, 例如流式连接器和一些新加入的模块。 为了运行依赖这些模块的代码,你需要确保模块在运行时是可访问的,为此我们有两点建议:

  1. 复制必需的 jar 文件到lib文件夹,以提供给你所有的 TaskManagers 。注意,复制之后需要重启你的 TaskManagers 。
  2. 或者将这些包打包进你的代码。

推荐使用较新的版本,因为它遵循了 FLink 中的类加载管理器

使用Maven打包你的用户代码的依赖包

在使用 maven 时,如果想要打包的依赖不在 Flink 包中,建议使用以下两种方法:

  1. maven 的 assembly 插件构建了一个所谓的高级 jar 包(可执行 jar 包),可以包含你的所有依赖项。 assembly 的配置方法很明了,但是得到的 jar 包可能会变得笨重。 了解更多信息,请查看maven-assembly-plugin
  2. 使用 maven 的 unpack 解包插件把相关依赖解包出来,然后打包进你的代码。

使用较新的方法来捆绑 Kafka 连接器flink-connector-kafka,为此 你需要同时从连接器和 Kafka API 本身来添加加类。在你的插件配置中添加如下代码。

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-dependency-plugin</artifactId>
  4. <version>2.9</version>
  5. <executions>
  6. <execution>
  7. <id>unpack</id>
  8. <!-- executed just before the package phase -->
  9. <phase>prepare-package</phase>
  10. <goals>
  11. <goal>unpack</goal>
  12. </goals>
  13. <configuration>
  14. <artifactItems>
  15. <!-- For Flink connector classes -->
  16. <artifactItem>
  17. <groupId>org.apache.flink</groupId>
  18. <artifactId>flink-connector-kafka</artifactId>
  19. <version>{{ site.version }}</version>
  20. <type>jar</type>
  21. <overWrite>false</overWrite>
  22. <outputDirectory>${project.build.directory}/classes</outputDirectory>
  23. <includes>org/apache/flink/**</includes>
  24. </artifactItem>
  25. <!-- For Kafka API classes -->
  26. <artifactItem>
  27. <groupId>org.apache.kafka</groupId>
  28. <artifactId>kafka_<YOUR_SCALA_VERSION></artifactId>
  29. <version><YOUR_KAFKA_VERSION></version>
  30. <type>jar</type>
  31. <overWrite>false</overWrite>
  32. <outputDirectory>${project.build.directory}/classes</outputDirectory>
  33. <includes>kafka/**</includes>
  34. </artifactItem>
  35. </artifactItems>
  36. </configuration>
  37. </execution>
  38. </executions>
  39. </plugin>

现在,如果执行mvn clean package,产生的 jar 包将包含所需的依赖。