@ghimi
2018-05-24T15:00:06.000000Z
字数 2015
阅读 1227
jar包冲突
在开发过程当中,编译期间发生的异常比较好确定,但是有些在代码运行期间出现的问题,有时候在我们开发过程中是无法预测的。如下:
java.lang.ClassNotFoundException
java.lang.NoSuchFieldException
java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError
java.lang.LinkageError
...
遇到下面这些异常问题,我们应该如何定位问题及解决问题:
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包路径,
但如果还是还是提示ClassNotFoundException等运行异常则采用 System.getproperty("java.classpath"), 打印出运行环境中的jar包加载顺序(依赖加载顺序靠前的jar包)
如果多个不同的jar包中都包含相同的类(Package+FileName)冲突导致的问题
# java -cp [包名] -verbose:class 主函数入口 >信息输出路径
$java -cp netty.jar -verbose:class com.phei.netty.DoJavaMain >load.log
通过参数可以输出java在运行过程中包的加载顺序,从而可以得知哪些类重复加载了.
返回结果中可以查找到类加载的是哪个jar包下的,然后解决Jar包加载顺序
>用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 ; 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。