linux下weblogic ReflectionUtils.makeAccessible(Ljava/lang/reflect/Constructor;)V异常

本文介绍了解决在WebLogic服务器上部署应用时遇到的Spring版本冲突问题,特别是因ReflectionUtils.makeAccessible方法引起的异常。通过替换Spring相关组件,成功解决了部署问题。

工程在本地windows机器上面安装weblogic部署正常,迁移到linux(64位)下安装32位的weblogic10.3出现异常

 

<Jan 15, 2013 5:13:23 PM CST> <Error> <Deployer> <BEA-149231> <Unable to set the activation state to true for the application 'ETeller'.
weblogic.application.ModuleException: 
        at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1510)
        at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:482)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
        at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
        Truncated. see log file for complete stacktrace
Caused By: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible(Ljava/lang/reflect/Constructor;)V
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:125)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:236)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
        Truncated. see log file for complete stacktrace


网上查找解决方案都说是   仔细检查是由于有两个包asm2.0.3.jar和asm.jar以及有spring-core.jar和spring-2.0.5core.jar,包冲突,删除asm2.0.3.jar和spring-2.0.5core.jar后重新启动正常 , 但是仔细查找了lib下的jar和weblogic公共module和service下面都没有这两个包,我们系统中并没有使用,

然后去官网下载最新的32位12版本和64位版本的10.3weblogic,错误依旧,排除weblogic的问题,

然后通过启动的时候打出的日志发现错误找的包路径为

[Loaded org.springframework.util.ReflectionUtils from file:/bea/app/products/WEB-INF/lib/spring-1.2.x.jar]
 
应该是spring-1.2.x.jar和spring-core-3.0.3.RELEASE.jar的冲突,应该是调用spring-core-3.0.3.RELEASE.jar中的ReflectionUtils类的makeAccessible方法,却去了spring-1.2.x.jar中寻找
 
最后解决方案是替换掉系统中使用的这几个包
WEB-INF/lib/spring-context-support-2.5.6.jar
WEB-INF/lib/spring-1.2.x.jar
WEB-INF/lib/spring-jms-3.0.3.RELEASE.jar
WEB-INF/lib/spring-tx-3.0.3.RELEASE.jar
WEB-INF/lib/spring-core-3.0.3.RELEASE.jar
WEB-INF/lib/spring-context-3.0.3.RELEASE.jar



全部替换为

WEB-INF/lib/org.springframework.beans-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.jms-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.jdbc-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.aspects-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.test-3.0.3.RELEASE.jar
WEB-INF/lib/javassist-3.12.0.GA.jar
WEB-INF/lib/org.springframework.instrument.tomcat-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.web.servlet-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.oxm-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.web.portlet-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.web-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.asm-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.context-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.transaction-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.core-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.expression-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.web.struts-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.orm-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.context.support-3.0.3.RELEASE.jar
WEB-INF/lib/hibernate3.jar
WEB-INF/lib/org.springframework.instrument-3.0.3.RELEASE.jar
WEB-INF/lib/org.springframework.aop-3.0.3.RELEASE.jar


 

最后启动问题解决,但是还留下一个疑问,就是以前也是64位的Linux系统和weblogic,但是当时就没有出现问题,可惜当时部署的同事早就闪人了,所以我一开始

觉得应该是weblogic公共部分有jar冲突,可惜找遍了weblogic也没用找到有冲突的部分,最终只能走下策,替换jar,替换一堆jar启动是没有问题了,但是可能对应用有些影响

 

 


 

<think>我们正在处理一个Java运行时错误:java.lang.NoSuchMethodError。这个错误表明在运行时尝试调用一个方法(这里是一个构造方法)但找不到。 具体错误信息:找不到`com.lkm.ejb.statistics.domain.StatisticsDm`类的构造方法,该构造方法参数为一个String, 四个String, 一个int, 两个String, 两个double, 一个int, 一个double, 两个int, 两个String, 一个Date, 一个String, 一个Date(根据参数类型列表可数出共20个参数)。 常见原因: 1. 编译时存在该方法,但运行时缺失(例如,类文件版本不一致,编译时使用的类与运行时使用的类不同)。 2. 多个版本的jar包冲突,导致加载了错误的类版本。 3. 清理或构建问题,导致类文件未更新。 解决步骤: 1. 确认错误发生的环境: - 开发环境还是生产环境? - 是否使用了构建工具(如Maven、Gradle)?是否使用了依赖管理? 2. 检查类文件是否存在该方法: - 找到包含`com.lkm.ejb.statistics.domain.StatisticsDm`类的jar包或类路径位置。 - 使用反编译工具(如JD-GUI)或使用`javap`命令查看该类的构造方法是否存在。 例如:`javap -classpath your_jar_path -p com.lkm.ejb.statistics.domain.StatisticsDm | grep '<init>'` 注意:需要查看具有20个参数的构造方法(参数类型顺序如错误信息所示)。 3. 检查依赖冲突: - 如果使用Maven,可以运行`mvn dependency:tree`查看依赖树,检查是否有多个不同版本的同一库。 - 检查是否有两个不同的jar包包含相同的全限定类名(特别是不同的版本)。 4. 清理和重新构建: - 执行清理命令(如Maven的`mvn clean`),然后重新构建项目(如`mvn install`)。 5. 检查类加载顺序: - 如果使用应用服务器(如Tomcat, WebLogic),检查类加载顺序,确保加载了正确的jar包。 6. 检查方法签名是否一致: - 检查源代码中该构造方法的参数类型是否与编译后的版本一致。例如,参数类型中如果有内部类,要注意内部类的命名变化(如外部类$内部类)。 7. 检查是否有混淆器(Proguard)或代码优化工具修改了方法签名。 8. 如果是在开发环境中,检查IDE的编译输出路径是否包含了最新的类文件。 针对这个特定的错误,由于参数非常多,很容易在重构代码时出现参数顺序改变或者参数类型改变(比如将`int`改为`Integer`)而只重新编译了部分代码,导致不一致。 建议的步骤: 第一步:清理项目并重新编译整个项目。 第二步:如果使用Maven/Gradle,检查依赖树,排除冲突的依赖。 第三步:确认运行时类路径中只有一个版本的`StatisticsDm`类,并且该版本包含这个20个参数的构造方法。 如果问题仍然存在,可以尝试以下具体操作: 1. 使用`javap`查看编译后的类文件中的构造方法签名: ```bash javap -classpath <path_to_your_jar_or_class_directory> -p com.lkm.ejb.statistics.domain.StatisticsDm ``` 在输出中查找对应参数数量的构造方法,对比签名是否一致。 2. 如果使用IDE,可以查看依赖关系,并检查是否有重复的类。 3. 如果项目模块化,检查模块间依赖的版本一致性。 相关问题: 1. 如何排查Java中的NoSuchMethodError? 2. Maven项目中如何解决依赖冲突? 3. 如何使用javap查看类的方法签名? 4. 在Java项目中如何管理依赖版本以避免冲突? </think>针对 `java.lang.NoSuchMethodError` 错误(特别是构造方法缺失问题),以下是系统性的解决方案: ### 错误原因分析 该错误表明 JVM 在运行时找不到 `StatisticsDm` 类的特定构造方法,常见原因包括: 1. **依赖版本不一致**:编译时使用了新版类(含该构造方法),但运行时加载了旧版依赖。 2. **编译残留问题**:类文件未同步更新,导致编译生成的字节码与源码不匹配。 3. **方法签名不匹配**:构造方法的参数类型、顺序或数量被修改后未完全重新编译。 4. **类加载冲突**:多个 ClassLoader 加载了不同版本的类[^1]。 --- ### 解决步骤 #### 第一步:清理并重建项目 ```bash # Maven 项目 mvn clean install -U # Gradle 项目 gradle clean build --refresh-dependencies ``` - **作用**:清除旧编译文件,强制重新下载依赖并编译。 - **注意**:检查构建日志确认 `StatisticsDm` 类被成功编译。 #### 第二步:验证依赖一致性 1. **检查依赖树**: ```bash mvn dependency:tree | grep "com.lkm.ejb.statistics" ``` - 观察是否存在多个冲突版本(如 `jar A:1.0` 和 `jar A:2.0`)。 2. **排除冲突依赖**(pom.xml 示例): ```xml <dependency> <groupId>com.lkm.ejb</groupId> <artifactId>statistics-lib</artifactId> <version>正确版本</version> <exclusions> <exclusion> <groupId>冲突组</groupId> <artifactId>冲突模块</artifactId> </exclusion> </exclusions> </dependency> ``` #### 第三步:检查方法签名 1. **反编译运行时类**: - 使用 JD-GUI 或 `javap` 检查 JVM 实际加载的类: ```bash javap -p -cp "your_classpath" \ com.lkm.ejb.statistics.domain.StatisticsDm | grep "<init>" ``` - 确认运行时类中是否存在目标构造方法: ```java // 期望的方法签名 public com.lkm.ejb.statistics.domain.StatisticsDm( String, String, String, String, int, String, String, double, double, int, int, double, int, int, String, String, Date, String, Date ) ``` 2. **对比源码**: - 核实构造方法的参数顺序和类型是否与源码一致(特别注意基本类型 `int`/`double` 与包装类型 `Integer`/`Double` 的差异)。 #### 第四步:排查类加载问题 1. **检查类加载路径**: ```java System.out.println(StatisticsDm.class.getProtectionDomain().getCodeSource().getLocation()); ``` - 确认加载的 JAR 路径是否符合预期。 2. **应用服务器注意事项**: - 清理服务器缓存(如 Tomcat 的 `work/` 目录)。 - 检查部署包中是否包含冲突的 JAR(如 `lib/` 和 `WEB-INF/lib/` 重复)。 --- ### 预防措施 1. **依赖管理**: - 使用 Maven `dependencyManagement` 或 Gradle `constraints` 统一版本。 - 定期运行 `mvn versions:display-dependency-updates` 检查更新。 2. **持续集成**: ```yaml # CI 配置示例(GitLab CI) build: script: - mvn clean package - java -jar target/app.jar verify-class-signatures # 添加签名校验步骤 ``` 3. **IDE 配置**: - 在 IntelliJ/Eclipse 中开启 **自动构建项目**(Build Automatically)。 --- ### 相关问题 1. 如何定位 JAR 包冲突导致的 `NoClassDefFoundError`? 2. Maven 依赖调解(Dependency Mediation)的优先级规则是什么? 3.WebLogic 中如何解决类加载器隔离问题? 4. 为何 `mvn clean install` 后运行时仍出现编译问题? [^1]: Java 官方文档指出 `NoSuchMethodError` 通常由编译-运行时类版本不一致引起,详见 [Oracle 文档](https://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodError.html)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值