继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java依赖版本冲突

2018-10-14 22:20:499846浏览

Jimmy

1实战 · 6手记 · 4推荐
TA的实战

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] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

编译设置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以前的也没有参考价值 参考 http://maven.apache.org/docs/history.html

  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 相关的版本依赖 参考 http://tomcat.apache.org/whichversion.html

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
打开App,阅读手记
3人推荐
发表评论
随时随地看视频慕课网APP