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
- 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 相关的版本依赖 参考 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