一场战争中的阶级无法在同一个耳朵的另一场战争中进入阶级

2 java jboss java-ee

我有一个包含2个war文件的ear,其中一个包含junit类,另一个包含junits引用的实际应用程序类.现在执行junits时,我得到一个java.lang.NoClassDefFoundError

是否由于junit类文件位于不同的耳朵,因此无法访问位于另一个耳朵的应用程序类文件?

要么

这是否是由于部署问题,虽然我能够运行应用程序以及一些独立于另一个耳中的应用程序类的仲裁?

ska*_*man 6

根据严格的JavaEE可见性语义,WAR内的类不应对同一EAR的其他组件可见.JBoss放松了这一点,并试图压缩类加载层次结构以减少它的刺激性,但WAR限制仍然存在.

我使用的解决方案是只将Web资源放入WAR中,并将WAR的类文件放入EAR内的单独JAR中.这样,webapp本身就可以找到类,所以你的单元也可以测试webapp.


Pav*_*vel 5

正确的方法是将公共类移动到专用JAR中,并将其绑定到EAR级别.所以你将有这样的结构:

  • 业务逻辑-JAR
  • 主web-app的战争
  • 测试web应用程序战
  • 应用耳

您可以将JAR以及您依赖的任何其他库捆绑在EAR中,并使用WAR的清单文件引用它们.在MANIFEST.MF中,它看起来像:

Class-Path: business-logic-1.0.jar spring-2.5.5.jar ...
Run Code Online (Sandbox Code Playgroud)

您仍然可以在每个WAR的WEB-INF/lib文件夹中捆绑其他JAR,例如test-web-app-war中的junit.如果您正在使用Maven,请阅读瘦的战争页面以获取一般方法.