EAR文件只是各种企业模块(EJB jar,WAR文件和常规jar文件)的容器,这些容器具有一些定义明确(但常常被误解)的规则,哪些类可以看到哪些规则。
在大多数情况下,您将看到具有以下内部结构的EAR文件:
EAR -lib | - utilityA.jar | - utilityB.jar | - ... |- ejb-jarC.jar |- ejb-jarD.jar |- ... |- warE.jar |- warF.jar |- ...
出于类可见性的考虑,该EAR上面显示了五个模块:
- lib模块
- ejb-jar1.jar
- ejb-jar2.jar
- war1.jar
- war2.jar
哪里:
- lib模块中的所有jar都被视为在同一模块中;
- 每个WAR文件中的所有jar和类都被视为在同一模块中;
- 每个ejb-jar是一个独立的模块。
通常,每个模块都有自己的类加载器。
现在,JBossAS / WildFly放宽了类可见性规则,以使开发人员的生活更简单(并且出于历史原因)。在这些服务器实现上,规则是:
- 每个WAR模块都可以看到自己的类,每个EJB jar中的类以及EAR / lib目录中每个jar中的类。
- 它看不到 其他 WAR模块中的类;
- 每个EJB模块可以看到它自己的类,其他EJB模块中的类以及EAR / lib目录中每个jar中的类。
- 它看不到 任何 WAR模块中的类;
- EAR / lib模块中的类只能互相查看:
- 他们看不到 任何 EJB模块或WAR模块中的类
更严格的实现将需要定义清单类路径条目,以使EJB模块和WAR模块彼此可见。
现在,鉴于上述所有情况,您的特定问题很可能是以下情况之一:
- lib模块中的类试图访问EJB模块之一或WAR模块之一中的类-您是否将struts2 jars放在EAR / lib目录中?
- 试图访问其中一个WAR模块中的类的EJB模块中的类
综上所述,由于您使用的是JavaEE 7服务器,因此可以使您的生活更加轻松。
只需将包括EJB在内的所有内容打包到WAR文件中。您可能没有从构建和部署EAR中获得任何好处



