[关闭]
@ghimi 2018-05-24T15:00:06.000000Z 字数 2015 阅读 1227

JVM运行jar包冲突时解决方案

jar包冲突


在开发过程当中,编译期间发生的异常比较好确定,但是有些在代码运行期间出现的问题,有时候在我们开发过程中是无法预测的。如下:

java.lang.ClassNotFoundException
java.lang.NoSuchFieldException

java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError
java.lang.LinkageError
...

遇到下面这些异常问题,我们应该如何定位问题及解决问题:
jar包版本冲突导致的问题:

Intellij Shift+Shift 查找文件的坐标,查找所需类所在的jar包版本

mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring-core
mvn dependency:tree -Dincludes=org.springframework:spring-core
优先按照依赖管理元素中指定的版本声明进行仲裁,此时下面的两个原则都无效了
若无版本声明,则按照“短路径优先”的原则(Maven2.0)进行仲裁,即选择依赖树中路径最短的版本
若路径长度一致,则按照“第一声明优先”的原则进行仲裁,即选择POM中最先声明的版本

如果还是有问题就看,打包方式,及MANIFAST.MF文件中Class-Path中是否声明了该jar包
如果声明了该jar包路径,

  1. # java -cp [包名] -verbose:class 主函数入口 >信息输出路径
  2. $java -cp netty.jar -verbose:class com.phei.netty.DoJavaMain >load.log

通过参数可以输出java在运行过程中包的加载顺序,从而可以得知哪些类重复加载了.
返回结果中可以查找到类加载的是哪个jar包下的,然后解决Jar包加载顺序

  1. >用法: java [-options] class [args...]
  2. (执行类)
  3. java [-options] -jar jarfile [args...]
  4. (执行 jar 文件)
  5. 其中选项包括:
  6. -d32 使用 32 位数据模型 (如果可用)
  7. -d64 使用 64 位数据模型 (如果可用)
  8. -server 选择 "server" VM
  9. 默认 VM server.
  10. -cp <目录和 zip/jar 文件的类搜索路径>
  11. -classpath <目录和 zip/jar 文件的类搜索路径>
  12. ; 分隔的目录, JAR 档案
  13. ZIP 档案列表, 用于搜索类文件。
  14. -D<名称>=<值>
  15. 设置系统属性
  16. -verbose:[class|gc|jni]
  17. 启用详细输出
  18. -version 输出产品版本并退出
  19. -version:<值>
  20. 警告: 此功能已过时, 将在
  21. 未来发行版中删除。
  22. 需要指定的版本才能运行
  23. -showversion 输出产品版本并继续
  24. -jre-restrict-search | -no-jre-restrict-search
  25. 警告: 此功能已过时, 将在
  26. 未来发行版中删除。
  27. 在版本搜索中包括/排除用户专用 JRE
  28. -? -help 输出此帮助消息
  29. -X 输出非标准选项的帮助
  30. -ea[:<packagename>...|:<classname>]
  31. -enableassertions[:<packagename>...|:<classname>]
  32. 按指定的粒度启用断言
  33. -da[:<packagename>...|:<classname>]
  34. -disableassertions[:<packagename>...|:<classname>]
  35. 禁用具有指定粒度的断言
  36. -esa | -enablesystemassertions
  37. 启用系统断言
  38. -dsa | -disablesystemassertions
  39. 禁用系统断言
  40. -agentlib:<libname>[=<选项>]
  41. 加载本机代理库 <libname>, 例如 -agentlib:hprof
  42. 另请参阅 -agentlib:jdwp=help -agentlib:hprof=help
  43. -agentpath:<pathname>[=<选项>]
  44. 按完整路径名加载本机代理库
  45. -javaagent:<jarpath>[=<选项>]
  46. 加载 Java 编程语言代理, 请参阅 java.lang.instrument
  47. -splash:<imagepath>
  48. 使用指定的图像显示启动屏幕
  49. 有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注