关于maven依赖关系的问题

maven能够很是方便的管理jar包依赖问题。java

这几天遇到的问题是:使用maven在idea跑flink程序提示mysql

java.lang.ClassNotFoundException
java.lang.NoClassDefFoundErrorsql

 

开始时经过idea project structure(快捷键Ctrl+Alt+Shift+s)-libraries添加jar包,有不少jar包,经过手动一个个添加不是这么回事呀。apache

从新学习廖雪峰老师讲的maven。api

maven原本就能够本身管理包依赖的。那么是maven配置的不对?服务器

删除.m2目录repository里面全部的文件,在idea右键project-maven-reimport,从新从阿里云下载jar包(需在.m2目录配置settings.xml)。app

此处修改pom.xml <flink.version>1.9.1</flink.version> 的flink版本为1.9.1.maven

jar包已经从新下载好。仍然出现NoClassDefFoundError问题。ide

查看.m目录已经下载的jar包,flink-streaming-java_2.11-1.9.1.jar有那个类的,为何没有import呢?工具

原来:pom.xml中依赖关系是provided,不是compile。

<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
<scope>compile</scope>
</dependency>

 

Maven定义了几种依赖关系,分别是compiletestruntimeprovided

scope 说明 示例
compile 编译时须要用到该jar包(默认) commons-logging
test 编译Test时须要用到该jar包 junit
runtime 编译时不须要,但运行时须要用到 mysql
provided 编译时须要用到,但运行时由JDK或某个服务器提供 servlet-api

其中,默认的compile是最经常使用的,Maven会把这种类型的依赖直接放入classpath。

将依赖关系修改成compile,在project右键-maven-reimport,运行程序。至此,问题解决。

再问:其实这个程序我以前成功运行过屡次的,为何刚开始能够运行成功呢?

 

启示:解决问题不能蛮干,而要探寻问题和工具的本质,从源头上下手。

 

reference:

https://www.liaoxuefeng.com/wiki/1252599548343744/1309301178105890

https://blog.csdn.net/qq_24003079/article/details/87920001

http://wuchong.me/blog/2018/11/07/5-minutes-build-first-flink-application/

相关文章
相关标签/搜索