@ghimi
2018-05-24T15:00:06.000000Z
字数 2015
阅读 1364
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。