關於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/

相關文章
相關標籤/搜索