3

我们有许多 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,用于提取我正在拦截的方法的参数。

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

我们对这些 Web 客户端进行了许多单元测试,它们都通过了,证明它们各自没有问题。当所有服务都包含在面向客户的应用程序中时,我们会在启动时收到 java.lang.NoClassDefFoundError: ProceedingJoinPoint 异常(我们使用的是带有 JDK1.5.0_17 的 tomcat 5.5)。

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

我是否缺少必需的依赖项?这个问题是否有一个共同的原因(我昨天搜索过这个没有找到太多)?非常感激任何的帮助。

4

3 回答 3

1

经过这么长时间我们设法找到了解决这个问题的方法,当检测到 SVN 提交时,我们使用 Bamboo 来构建我们的项目。虽然竹子环境在构建依赖项目时设置为与我们的开发机器匹配,但它产生了这个奇怪的问题。

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

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

感谢大家的帮助。

于 2009-11-23T10:09:07.647 回答
0

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

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

于 2009-11-03T11:06:55.017 回答
0

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

于 2009-11-03T11:47:31.663 回答