我们有许多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" />
每个方面都引用一个pojobean,这些bean包含配置中声明的方法,方法参数类型为org.aspectj.lang.proceedingjoinpoint,用于提取我截取的方法的参数。
我们为每个web服务客户机(在applicationcontext webservicename.xml中)提供了一个这样的服务。此xml文件包含在打包的jar中,该jar包含在面向客户的应用程序中,并导入到由面向客户的应用程序的web.xml加载的主applicationcontext.xml中。
我们对这些web客户机进行了大量的单元测试,它们都通过了测试,证明它们没有任何问题。当所有的服务都包含在面向客户的应用程序中时,我们会得到一个java.lang.noclassdeffounderror:proceedingjoinpoint异常(我们使用的是Tomcat5.5和jdk1.5.017)。
我在javadoc中查找java.lang.noclassdeffounderror,以防它有特殊的含义,看起来jvm认为类不存在。然后,我寻找包含它声称找不到的类的jar(aspectjrt-1.5.4.jar和aspectjweaver-1.5.4.jar),这些类有一个重复,所以我尝试依次删除每个jar,看看会发生什么,完全相同的错误。
我是否缺少必需的依赖项?这个问题有共同的原因吗(我昨天搜索了这个,但没有找到多少)?任何帮助都将不胜感激。
3条答案
按热度按时间rqcrx0a61#
可能是类加载器的问题。aspectjjar在哪里?如果您现在在webinf/lib中有它们,也许您可以尝试将它们复制到tomcat common/lib中,看看是否有帮助。
可能是appserver类加载器在启动时需要它们,但是应用程序类加载器没有从webinf获取它们,因为它在类加载器层次结构中处于较低的位置。
pbossiut2#
只将aspectjrt.jar添加到server/lib文件夹,而不是aspectjweaver.jar。重复的类也会导致混淆。运行时jar(“rt”代表运行时)应该用于运行时。weaver jar用于编译/编织时。你用的是ltw还是ctw?
gfttwv5a3#
经过这么长时间的努力,我们终于找到了这个问题的解决方案,当检测到svn提交时,我们使用bamboo来构建我们的项目。尽管bamboo环境的设置是为了与我们的开发机器相匹配,但当它构建一个依赖的项目时,它产生了这个奇怪的问题。
我们仍然不知道它为什么这样做,但是与此同时,我们正在手动构建和部署这个特定的项目。
我对任何遇到类似问题的人的建议是,把自己从maven内部回购中隔离出来,在本地重建所有项目。
谢谢大家的帮助。