如何在 Linux 中使用 Maven 构建 Flink 应用程序

How to build a Flink application with Maven in Linux

我正在使用 Maven 在 CentOS 服务器上管理我的自定义 Flink 应用程序。我是 Java.

的初学者

为了构建一个空项目,我只是按照official doc,这意味着我执行了以下命令:

mvn archetype:generate                               \
      -DarchetypeGroupId=org.apache.flink              \
      -DarchetypeArtifactId=flink-quickstart-java      \
      -DarchetypeVersion=1.10.0

有效。我得到一个项目如下:

.
├── pom.xml
├── src
    └── main
        ├── java
        │   └── myflink
        │       ├── BatchJob.java
        │       └── StreamingJob.java
        └── resources
            └── log4j.properties

之后,我用简单的例子WordCount修改文件StreamingJob.java

然后我执行 mvn clean package 来尝试构建我的 jar 文件。

按照我的理解,我应该得到两个jar文件,一个是给BatchJob.java的,另一个是给StreamingJob.java的(就是WordCount的例子)。

然而,执行命令mvn clean package后,我得到myflink-1.jaroriginal-myflink-1.jar。我不知道它们是什么。此外,BatchJob.javaStreamingJob.java 似乎没有自己的 jar 文件。

那么文件myflink-1.jar是什么?它是否包含两个 java 文件?如果我想得到一个只包含StreamingJob.java的jar文件,我该怎么办?

您的 jar 文件适用于您的整个包,通常会聚合 java class 文件、一些元数据和资源文件。之所以是jar是因为在pom.xml中定义了<packaging>jar</packaging>。如果您展开 jar 文件,您会在各自的包中看到 java class 文件。

我们看到 2 jar 文件的原因是添加了 Maven Shade 插件。第一个 jar(flint-demo-1.0-SNAPSHOT.jar) 是从默认的 maven jar 插件生成的,另一个 (original-flint-demo-1.0-SNAPSHOT.jar) 来自 maven 阴影插件。

Maven Shade插件帮助我们生成uber-jar/fat jar。我们还可以控制依赖性,即 include/exclude 依赖性,如本示例 flink 项目中所做的那样。所以当你 运行 mvn clean package 你应该看到一些依赖被排除在 pom.xml 文件中定义如下所示

[INFO] --- maven-shade-plugin:3.1.1:shade (default) @ flint-demo ---
[INFO] Excluding org.slf4j:slf4j-api:jar:1.7.15 from the shaded jar.
[INFO] Excluding org.slf4j:slf4j-log4j12:jar:1.7.7 from the shaded jar.
[INFO] Excluding log4j:log4j:jar:1.2.17 from the shaded jar.
[INFO] Replacing original artifact with shaded artifact.

要了解有关 maven shade 插件的更多信息,您可以查看 here and here

如果您想排除任何文件,即在您的情况下说 BatchJob,您可以使用 Maven 编译器插件。我在示例项目中看到 maven 编译器插件已经存在,因此您只需要包含 <excludes>,如下所示

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <excludes>
            <exclude>com/flint/demo/BatchJob.java</exclude>
        </excludes>
    </configuration>
</plugin>

现在,当您执行 mvn clean package 并检查 jar 文件时,您应该看不到 BatchJob class 文件。

$ jar tf flint-demo-1.0-SNAPSHOT.jar
META-INF/MANIFEST.MF
META-INF/
com/
com/flint/
com/flint/demo/
com/flint/demo/StreamingJob.class
log4j.properties
META-INF/maven/
META-INF/maven/com.flint.demo/
META-INF/maven/com.flint.demo/flint-demo/
META-INF/maven/com.flint.demo/flint-demo/pom.xml
META-INF/maven/com.flint.demo/flint-demo/pom.properties

要了解有关 Maven 编译器插件的更多信息,请查看 here