现象
在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常:
1, java类找不到 java.lang.ClassNotFoundException
2, 方法不存在 java.lang.NoSuchMethodError
3, 字段不存在 java.lang.NoSuchFieldError
4, 类错误 java.lang.LinkageError
1, java类找不到 java.lang.ClassNotFoundException
2, 方法不存在 java.lang.NoSuchMethodError
3, 字段不存在 java.lang.NoSuchFieldError
4, 类错误 java.lang.LinkageError
原因
war包中jar包和服务器上jar包冲突, 由于现在服务器功能越来越强大, 而引入的jar也在不断增加,
出现的冲突的可能性也越来越大, 而且正式环境复杂, 而且不能轻易修改服务器相关配置,
为解决jar包冲突的问题带来困难, 如果去解决过这些问题, 那是相当折腾人的, 下面是一些方法的总结
根本
这类冲突根本原因就是: 同一个java类存在多个jar包或类路径中, 而这大多由于使用了不同jar包版本造成.
方法
1, 案例法
使用服务器上已有应用的jar包(前提:服务器上面已经部署过别的应用), 曾经使用过此方法解决冲突
2, 最小化法
正式环境有很多限制, 上传,部署,启停,测试这些过程越简单越好, 最近一次把war包中137jar删除只剩下14个jar包,
整个测试验证周期大大缩短
3, 来源法
如果能知道类加载于哪个jar包, 解决就比较容易, 在异常中会有出错类的完整类名,
如果能获取此类加载于那个jar包, 就能确认冲突的jar包,
如何知道class加载于那个jar包, 昨天灵机一动想到了一个方法, 其实也很简单, 代码如下:
clazz.getResource("className.class").toString();
后面有一个jsp专门获取class加载于那个jsp包, 可供下载使用.
4, 服务器分析法
了解各种应用服务器的class加载机制, 就能判断是什么原因, 什么时候导致的冲突, 这样可以通过调整class加载顺序解决,
最近一次WAS服务器上的jar包冲突就此方法解决.
war包中jar包和服务器上jar包冲突, 由于现在服务器功能越来越强大, 而引入的jar也在不断增加,
出现的冲突的可能性也越来越大, 而且正式环境复杂, 而且不能轻易修改服务器相关配置,
为解决jar包冲突的问题带来困难, 如果去解决过这些问题, 那是相当折腾人的, 下面是一些方法的总结
根本
这类冲突根本原因就是: 同一个java类存在多个jar包或类路径中, 而这大多由于使用了不同jar包版本造成.
方法
1, 案例法
使用服务器上已有应用的jar包(前提:服务器上面已经部署过别的应用), 曾经使用过此方法解决冲突
2, 最小化法
正式环境有很多限制, 上传,部署,启停,测试这些过程越简单越好, 最近一次把war包中137jar删除只剩下14个jar包,
整个测试验证周期大大缩短
3, 来源法
如果能知道类加载于哪个jar包, 解决就比较容易, 在异常中会有出错类的完整类名,
如果能获取此类加载于那个jar包, 就能确认冲突的jar包,
如何知道class加载于那个jar包, 昨天灵机一动想到了一个方法, 其实也很简单, 代码如下:
clazz.getResource("className.class").toString();
后面有一个jsp专门获取class加载于那个jsp包, 可供下载使用.
4, 服务器分析法
了解各种应用服务器的class加载机制, 就能判断是什么原因, 什么时候导致的冲突, 这样可以通过调整class加载顺序解决,
最近一次WAS服务器上的jar包冲突就此方法解决.
附录
深入探讨 Java 类加载器 http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
如何在 WebSphere 中解决 jar 包冲突 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/haoaili/0512/
后记
解决了一个问题,往往还有更大的问题,循环往复。
相关推荐
标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能内置了不同版本的库,或者在类加载机制上有差异,导致原本在Tomcat上运行良好的应用在WebLogic上出现问题。以下是一些...
- **OSGi**:Open Service Gateway Initiative提供了一种动态的模块化系统,允许不同版本的类共存,从而解决了`jar`包冲突问题。 5. **冲突解决策略**: - **优先级选择**:根据业务需求和库的重要程度设定优先级...
5. **合理组织类加载器**:在应用服务器如Tomcat中,可以通过调整类加载策略,比如使用`WEB-INF/classes`优先加载,避免不同模块重复引入的jar包产生冲突。 6. **使用jar包管理工具**:例如,使用FatJar或者One-Jar...
在解决 jar 包冲突问题时,我们可以使用以下几种方法: 1. 使用不同的类加载器来加载不同的 jar 包版本。这可以解决 jar 包版本冲突问题,因为不同的类加载器可以加载相同名字的类。 2. 使用共享库来共享 jar 包。...
为了解决这个问题,本文将从 WebSphere 中类加载器入手,讨论几种解决 jar 包冲突问题的办法。 WebSphere 中类加载器的层次结构 在 WebSphere 中,类加载器的层次结构是一个自上而下的分层结构,最上层是系统的...
"websphere下部署CXF项目jar包冲突问题解决方式"这一主题聚焦于如何在IBM Websphere Application Server (WAS)中成功部署包含Apache CXF Web服务的WAR包,解决由于类加载导致的运行异常。 Apache CXF是一个流行的...
在实际开发中,解决jar包冲突的常见策略有以下几点: 1. **版本管理**:确保所有依赖项统一使用相同版本的ASM库,避免版本不兼容。如果不同模块需要不同版本,考虑使用Maven的`<dependencyManagement>`或Gradle的`...
本篇将深入探讨这个问题,以及如何通过理解ClassLoader的工作原理和使用相关工具来有效地解决jar包冲突。 首先,我们来了解什么是ClassLoader。在Java中,ClassLoader是负责加载类到JVM中的组件。当遇到多个相同类...
Maven是一个项目管理和综合工具,它可以帮助开发者构建、测试、部署和管理Java项目,通过依赖管理解决jar包冲突问题。 5. **commons-logging.jar**:Apache Commons Logging是Java的日志抽象层,它允许开发者选择在...
解决Jar包冲突的方法通常有以下几种: 1. **排除冲突的库**:在项目的构建路径中,可以手动排除冲突的库或者指定特定版本的库。例如,如果两个库都包含了某个类,但版本不同,可以选择使用其中一个版本,并排除另一...
为了使用这些文件,你需要将它们部署到你的Web应用服务器中,通常将jar包放入WEB-INF/lib目录,而web.xml和dwr.xml则放入WEB-INF下。然后,在你的HTML或JavaScript代码中引入engine.js和util.js,通过它们提供的API...
为了解决这个问题,有以下几种策略: 1. **版本控制**:确保使用与Java EE 5.0兼容的`mail.jar`版本。不同的JavaMail版本可能对Java EE的API有不同的支持,选择一个与当前环境兼容的版本可以避免冲突。 2. **类...
SSM整合的3.2.13版本是一个稳定的版本,减少了可能出现的jar包冲突问题,使得开发者可以更专注于业务逻辑的实现,提高开发效率。这个版本可能包含了对之前版本的bug修复和性能优化,确保了项目的稳定运行。在实际...
7. **JAR冲突** 当两个或更多JAR包包含相同类时,可能会发生版本冲突。Java类加载器会优先加载先找到的类,这可能导致程序运行异常。解决方法包括使用不同的类加载策略,或采用模块化系统(如Java 9及更高版本的...
3. **使用Provided范围**:如果JSON处理是在服务器端完成,可以将相关jar包设置为`provided`范围,表示这些依赖由容器提供,避免打包到最终的WAR文件中。 4. **使用Struts2的JSON插件**:Struts2提供了JSON插件,...
在标题中提到的"I-Jetty相关jar包"指的是为了使I-Jetty能够正常运行,需要从官方或其他来源获取并添加的一系列依赖库。这些jar包包含了I-Jetty运行所需的组件和功能。 描述中提到"I-Jetty从官网下载下来以后不能...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。..."ssh不冲突jar包"提供了一种便捷的解决方案,减少了开发者在解决依赖冲突上花费的时间,从而更专注于业务逻辑的实现。
在这个“腾讯云短信服务jar包”中,主要包括了腾讯云短信服务的SDK(Software Development Kit),SDK封装了与腾讯云服务器交互的所有逻辑,包括网络请求、数据加密、错误处理等,使得开发者无需关注底层实现,只需...
在实际使用时,开发者应根据项目需求选择合适的jar包,并注意版本兼容性,避免引入不必要的冲突。同时,随着技术的发展,新的库和框架不断涌现,开发者也需要持续学习和更新知识,以适应不断变化的技术环境。