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

时间:2009-07-06 11:42:28

标签: java jboss java-ee

我的耳朵由2个war文件组成,一个包含junit类,另一个包含junits引用的实际应用程序类。 现在执行junits时,我得到一个java.lang.NoClassDefFoundError

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

OR

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

  • 业务逻辑的罐
  • 主web应用程序战
  • 测试web应用战
  • 应用耳

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

Class-Path: business-logic-1.0.jar spring-2.5.5.jar ...

您仍然可以在每个WAR的WEB-INF / lib文件夹中捆绑其他JAR,例如在test-web-app-war中的junit。如果您使用的是Maven,请阅读skinny war页面了解一般方法。

答案 2 :(得分:0)

JUnit类不属于WAR或EAR文件。不应该部署它们。

您没有说明您正在使用哪个应用服务器,但如果您使用WebLogic,则可以将所有.class文件放入APP-INF / classes。它们将在EAR级别可见,因此所有WAR都可以看到它们。