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定義了幾種依賴關係,分別是compile
、test
、runtime
和provided
:
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/