Java依賴版本衝突

youou發表於2021-09-09

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以前的也沒有參考價值 參考

  1. maven 2.2.0 到 3.1.1 以上需要java5
  2. maven 3.2.1 到 3.2.5 要求java6
  3. 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章