java.lang.NoClassDefFoundError:ProceedingJoinPoint

时间:2009-11-03 10:50:34

标签: java spring aspectj tomcat5.5 spring-aop

我们有许多Web服务客户端应用程序,它们在面向客户的主要应用程序和后端Web服务之间进行连接。这些Web服务应用程序生成自己的JAXWS存根代码,以直接与Web服务和实现代码连接,以在JAXWS代码与希望使用它的任何应用程序之间提供干净的接口。在过去的几周里,我们遇到了一些小问题,但大部分已经解决了。

当需要将这些问题集成到面向客户的应用程序时,我们遇到了许多问题,主要集中在JDK1.5和1.6不兼容问题上。这些已经解决了,但是我们遇到了另一个我们无法解决的问题。 Web服务客户端使用AOP来设置标头凭据,异常处理和限制等常见内容:

<aop:config>
    <aop:pointcut id="pointcut" expression="execution(* MyService.*(..))" />

    <aop:aspect id="throttling" ref="throttlingAdvisor">
        <aop:around pointcut-ref="pointcut" method="doThrottle" />
 </aop:aspect>
    <aop:aspect id="errorHandling" ref="errorHandlingAdvisor">
        <aop:around pointcut-ref="pointcut" method="handleExceptions" />

                 

每个方面都引用一个POJO bean,这些bean包含配置中使用方法参数类型为org.aspectj.lang.ProceedingJoinPoint的方法,这用于提取我正在拦截的方法的参数。 / p>

我们为每个Web服务客户端(在applicationContext-webservicename.xml中)中有一个。此xml文件包含在打包的JAR中,该JAR包含在面向客户的应用程序中,并导入到面向客户的应用程序的web.xml加载的主applicationContext.xml中。

我们为这些网络客户端提供了许多单元测试,它们都通过证明它们没有任何问题。当所有服务都包含在面向客户的应用程序中时,我们会在启动时收到java.lang.NoClassDefFoundError:ProceedingJoinPoint异常(我们将tomcat 5.5与JDK1.5.0_17一起使用)。

我查找JavaDoc以获取java.lang.NoClassDefFoundError,以防它具有特殊含义,看起来像JVM认为该类不存在。然后我查找了包含它声称无法找到的类的jar(aspectjrt-1.5.4.jar和aspectjweaver-1.5.4.jar),这些类有重复,所以我尝试依次删除每个jar来查看会发生什么,完全相同的错误。

我错过了必需的依赖吗?这个问题有一个共同的原因(昨天我搜索过这个问题并没有发现太多)?任何帮助都将非常感激。

3 个答案:

答案 0 :(得分:1)

在这段时间之后我们设法找到了这个问题的解决方案,我们使用Bamboo在检测到SVN提交时构建我们的项目。虽然竹子环境的设置是为了配合我们的开发机器,但是当它构建一个依赖项目时,却产生了这个奇怪的问题。

我们仍然不确定为什么会这样做,但与此同时我们正在手动构建和部署此特定项目。

我对任何遇到类似问题的人的建议,只是将自己与内部maven回购隔离开来,并在本地重建所有项目。

感谢大家的帮助。

答案 1 :(得分:0)

可能是类加载器问题。 AspectJ JARs在哪里?如果你现在在WEB-INF / lib中有它们,也许你可以尝试将它们复制到Tomcat common / lib中,看看是否有帮助。

应用服务器类加载器可能在启动时需要它们,但是应用程序类加载器还没有从WEB-INF获取它们,因为它在类加载器层次结构中较低。

答案 2 :(得分:0)

仅将aspectjrt.jar添加到server / lib文件夹,而不是aspectjweaver.jar。重复的类也可能导致混淆。运行时jar(“rt”代表运行时)应该用于运行时。编织器jar用于编译/编织时间。你在使用LTW还是CTW?