如何将编译类放入Uber-JAR的META-INF/services及Maven配置疑问
关于Flink StateFun Uber-JAR中META-INF/services配置的问题解答
是否需要配置maven-shade-plugin?
需要分情况处理:- 如果你的项目只有一个模块提供
org.apache.flink.statefun.sdk.spi.StatefulFunctionModule服务文件,默认shade插件会直接将其打包进Uber-JAR,无需额外配置。 - 如果有多个模块(包括依赖的第三方库)都定义了这个services文件,必须给shade插件配置
ServicesResourceTransformer,否则打包时后续文件会覆盖之前的,导致部分实现类丢失。配置示例:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并META-INF/services下的所有同名文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>
- 如果你的项目只有一个模块提供
MyClass.class的放置路径
编译后的MyClass.class必须按照完整包结构放在Uber-JAR的根目录下。比如你的类全限定名是org.package1.package2.MyClass,那么在JAR中的路径应为org/package1/package2/MyClass.class,不要将class文件放到META-INF/services目录下。META-INF/services文件的规则
- 文件名必须严格为
org.apache.flink.statefun.sdk.spi.StatefulFunctionModule,与接口的全限定名完全一致。 - 文件内容是你的实现类的全限定名,即
org.package1.package2.MyClass,每个实现类单独占一行。示例文件内容:org.package1.package2.MyClass
- 文件名必须严格为
内容的提问来源于stack exchange,提问作者mangusta
相关产品推荐
相关产品推荐

