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

二进制发行版的 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 本身来添加加类。在你的插件配置中添加如下代码。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>unpack</id>
            <!-- executed just before the package phase -->
            <phase>prepare-package</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <!-- For Flink connector classes -->
                    <artifactItem>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-connector-kafka</artifactId>
                        <version>1.2</version>
                        <type>jar</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        <includes>org/apache/flink/**</includes>
                    </artifactItem>
                    <!-- For Kafka API classes -->
                    <artifactItem>
                        <groupId>org.apache.kafka</groupId>
                        <artifactId>kafka_<YOUR_SCALA_VERSION></artifactId>
                        <version><YOUR_KAFKA_VERSION></version>
                        <type>jar</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        <includes>kafka/**</includes>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

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