问题背景:
1、在打包flink程序时,将pom.xml文件中的依赖包添加了scope元素标签:
<!--Flink 1.17相关依赖包 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
2、然后再重新运行Flink程序的时候,出现报错:
换而言之,我程序编译时是OK的。但是当程序真正运行起来 ,却报了缺少jar包的错误。
原因分析:
查找资料发现,原来是pom.xml中的scope标签的影响。
scope标签的作用:
控制依赖的使用范围,指定当前jar包的依赖范围和依赖的传递性。常用的可选值有:
compile、provided、runtime、test、system
compile:默认值。compile表示对应依赖会参与当前项目的编译、测试、运行等,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下。比如:spring-core这些核心的jar包。
provided:provided适合在编译和测试的环境,和compile功能相似,但provide仅在编译和测试阶段生效,provide不会被打包,也不具有传递性。比如:上面讲到的spring-boot-devtools、servlet-api等,前者是因为不需要在生产中热部署,后者是因为容器已经提供,不需要重复引入。
runtime:仅仅适用于运行和测试环节,在编译环境下不会被使用。比如编译时只需要JDBC API的jar,而只有运行时才需要JDBC驱动实现。
test:scope为test表示依赖项目仅参与测试环节,在编译、运行、打包时不会使用。最常见的使用就是单元测试类了。
system:system范围依赖与provided类似,不过依赖项不会从maven仓库获取,而需要从本地文件系统提供。使用时,一定要配合systemPath属性。不推荐使用,尽量从Maven库中引用依赖。
import: import scope只能用在dependencyManagement里面。表示从其它的pom中导入dependency的配置。
————————————————
版权声明:本文为CSDN博主「SuperForceQiang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouzeqiang/article/details/118386793
我使用的是provided,也就是说当我程序运行起来时,被打上provided标签的两个依赖实际上并未真正导入到我本地的flink程序中。这也就是为何会报classpath not found的错误了。
解决办法:
一、依赖项去掉 <scope>provided</scope>即可。但是这样当我程序打包的时候,flink程序会携带flink-clients的相关jar包。而实际程序运行所在的容器已经提供了相关jar包,不需要重复引入。
二、本地idea运行时,勾选上Include dependencies with “Provided” scope选项。
在build and run 中的 modify option中勾选上 Include dependencies with “Provided (中文idea的话如下图所示)
调试结果:
程序正常运行,不再报错