關於maven依賴關系的問題


maven可以非常方便的管理jar包依賴問題。

這幾天遇到的問題是:使用maven在idea跑flink程序提示

java.lang.ClassNotFoundException
java.lang.NoClassDefFoundError

 

開始時通過idea project structure(快捷鍵Ctrl+Alt+Shift+s)-libraries添加jar包,有很多jar包,通過手動一個個添加不是這么回事呀。

重新學習廖雪峰老師講的maven。

maven本來就可以自己管理包依賴的。那么是maven配置的不對?

刪除.m2目錄repository里面所有的文件,在idea右鍵project-maven-reimport,重新從阿里雲下載jar包(需在.m2目錄配置settings.xml)。

此處修改pom.xml <flink.version>1.9.1</flink.version> 的flink版本為1.9.1.

jar包已經重新下載好。仍然出現NoClassDefFoundError問題。

查看.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,運行程序。至此,問題解決。

再問:其實這個程序我之前成功運行過多次的,為什么剛開始可以運行成功呢?

 

2020.2.1

調試《基於Apache Flink的流處理》書中的Scala案例(Flink 1.7.1,Scala2.12.8)時報錯:

Error:scalac: Error: java.lang.RuntimeException: /packages cannot be represented as URI
java.io.IOError: java.lang.RuntimeException: /packages cannot be represented as URI
    at java.base/jdk.internal.jrtfs.JrtPath.toUri(JrtPath.java:176)
    at scala.tools.nsc.classpath.JrtClassPath.asURLs(DirectoryClassPath.scala:213)
    at scala.tools.nsc.classpath.AggregateClassPath.$anonfun$asURLs$1(AggregateClassPath.scala:64)
    at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:244)
    at scala.collection.Iterator.foreach(Iterator.scala:941)
    at scala.collection.Iterator.foreach$(Iterator.scala:941)
......

經過bing搜索,找到https://github.com/scala/scala/releases/tag/v2.12.9

寫到:

Scala 2.12.9 contains various fixes to improve compatibility with JDK 11, 12, and 13.

Backport upgrade to ASM 7 for JDK 12 compatibility (#7780)
Fix -release N flag on JDK 12+ (#7763)
Fix "cannot be represented as URI" on JDK 13 (#8210)
Add JDK 9 constant types to the ClassfileParser to fix Scaladoc generation issue (#8289)

於是將IDEA project的Scala SDK換成2.12.9,問題解決。

替換IDEA project的Scala SDK的方法:

1、在project右鍵選擇Open Module Settings,選中libraries,+號,Scala SDK,選中一個ivy,download,選擇要下載的SDK版本號,本例是2.12.9。

2、選中Global libraries,+號,Scala SDK,選中ivy 2.12.9.

3、-號其他版本Scala  SDK。

 

啟示:解決問題不能蠻干,而要探尋問題和工具的本質,從源頭上下手。

 

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/

https://github.com/scala/scala/releases/tag/v2.12.9

https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.3   20210314增加


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM