Java依賴版本衝突
Java依賴版本衝突
大家做java開發的過程經常會碰到依賴版本衝突的問題,比如java編譯的版本與執行的版本不一致可能會存在問題,專案使用的spring 版本與java版本不相容等等,這裡給介紹一下如果java版本衝突的幾種情況以及報錯的內容,方便大家碰到問題時及時修改對應的配置避免java版本及依賴衝突耽誤太多時間。
高版本編譯的jar用於低版本jdk
如果我們專案依賴的一個jar檔案是基於java8編譯的,如果專案老舊依賴的小於java8的jdk,比如說使用的java1.7,那麼系統執行過程會報錯java.lang.UnsupportedClassVersionError。
在java版本7的情況執行透過java版本8安裝的包
~ java -jar target/boot-sample-0.0.1-SNAPSHOT.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/boot/sample/SampleApplication : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:442)
at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:89)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
這個問題怎麼解呢?有兩個方法,1:升級我們專案使用的jdk到1.8支援這個jar的編譯版本;2:對依賴的jar重新透過java1.7編譯打包。一般我們會透過第一種方法自行升級解決。對於第二個方法,作為一個公共包的釋出者應該在允許的情況下儘量支援更低的java版本,如果這個jar不依賴java8的一些新的特性api,那麼最好使用低版本的java編譯安裝,這樣可以有更多的支援面。
採用java高版本特性程式碼不支援低版本java編譯打包
比如一段程式碼使用到了java1.8才提供的 java.util.Optional這個類,那麼這個工程編譯發包的最低版本只能是java1.8,如果刻意降低版本到java1.7則會發生常見的編譯失敗問題找不到符號類Optional
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project boot-sample: Compilation failure: Compilation failure:
[ERROR] sample/src/main/java/com/boot/sample/SampleApplication.java:[12,17] 找不到符號
[ERROR] 符號: 類 Optional
[ERROR] 位置: 程式包 java.util
[ERROR] sample/src/main/java/com/boot/sample/SampleApplication.java:[36,13] 找不到符號
[ERROR] 符號: 類 Optional
[ERROR] sample/src/main/java/com/boot/sample/SampleApplication.java:[36,37] 找不到符號
[ERROR] 符號: 變數 Optional
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1]
編譯設定target與source儘量保持一致
現在java開發大多采用maven管理專案,maven的編譯外掛配置類似
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf8</encoding>
</configuration>
</plugin>
這的source配置1.7於target配置1.7要儘量保持一致,如果配置不一致會出現下面的問題
編譯設定target1.7小於source1.8報錯
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ boot-sample ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to samples/boot/sample/target/classes
javacTask: 源發行版 1.8 需要目標發行版 1.8
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] An unknown compilation problem occurred
[INFO] 1 error
[
本地java 1.7 配置 maven-compiler-plugin target 1.8,
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project petclinic-model: Fatal error compiling: 無效的目標發行版: 1.8 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[
Java與Maven版本關係
maven1和maven2不討論了,java5以前的也沒有參考價值 參考
- maven 2.2.0 到 3.1.1 以上需要java5
- maven 3.2.1 到 3.2.5 要求java6
- maven 3.3.1 開始要求 java7
Java與Tomcat
java與tomcat的關係這裡要設計到servlet、jsp和WebSocket 相關的版本依賴 參考
Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | JASPIC Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
---|---|---|---|---|---|---|---|
4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.11 | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.33 | 7 and later |
3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.53 (superseded) | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.90 | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x (archived) | 6.0.53 (archived) | 5 and later |
2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
Java與Spring
- JDK 8 中可以使用 Spring Framework 5.x
- JDK 7 中可以使用 Spring Framework 4.x
- JDK 6 中可以使用 Spring Framework 4.x
- JDK 5 中可以使用 Spring Framework 3.x
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2815293/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter | 如何優雅的解決依賴版本衝突Flutter
- Maven依賴衝突處理Maven
- maven依賴衝突以及解決方法Maven
- 依賴衝突時的解決方法
- Maven依賴衝突解決總結Maven
- maven解決jar包依賴衝突MavenJAR
- 一招解決所有依賴衝突
- 請教一個關於 STF 依賴的 node 與 Appium 依賴的 node 版本衝突問題APP
- Maven中解決依賴衝突的問題Maven
- composer包依賴衝突解決一例
- 文盤Rust -- 本地庫引發的依賴衝突Rust
- Gradle 使用技巧(四) - 如何定位和解決依賴衝突Gradle
- Git Worktree:解決分支依賴衝突的問題Git
- 關於 OkHttp 依賴衝突問題的解決過程HTTP
- Android Studio中架包打包和依賴衝突解決Android
- RxAndroid2+RxLifecycle2+Retrofit2 依賴引入和衝突分析Android
- SVN 版本衝突解決
- Composer騷操作,使用本地git目錄作為依賴解決衝突Git
- 使用maven-shade-plugin外掛解決spark依賴衝突問題MavenPluginSpark
- yarn安裝中出現依賴衝突 package.json 中的resolutions 欄位YarnPackageJSON
- cargo 中的版本依賴Cargo
- git 解決版本衝突問題Git
- Maven依賴版本更新踩坑Maven
- GO 問題之多版本衝突解決Go
- Git 解決本地遠端版本衝突Git
- Servlet版本衝突導致頁面404Servlet
- npm如何管理依賴包的版本NPM
- 有關專案依賴包發生 Manifest Merge 衝突的詳細解決方案
- Maven依賴版本號引發的血案Maven
- Androidstuio有關導如專案作為依賴以及出現包衝突的解決辦法AndroidUI
- svn檔案衝突,樹衝突詳解
- 如何防止jQuery庫不同版本之間的衝突jQuery
- Maven Dependency Version:依賴版本自動升級Maven
- 依賴管理和依賴範圍
- JAXBContext版本衝突java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present atContextJavaExceptionXML
- 依賴
- 依賴倒置(DIP)與依賴注入(DI)依賴注入
- jquery如何解決版本之間衝突的問題jQuery