如何在 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.jar
和original-myflink-1.jar
。我不知道它们是什么。此外,BatchJob.java
和 StreamingJob.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
我正在使用 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.jar
和original-myflink-1.jar
。我不知道它们是什么。此外,BatchJob.java
和 StreamingJob.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