2012-03-05 21 views
1

我正在将常规J2EE应用程序转换为使用Maven。我能够成功转换为Maven,并且我获得了成功的“mvn deploy”。在将耳朵部署到WAS之后,这个问题正在面临。我得到 SRVE0203E:Servlet [action] org.apache.struts.action.ActionServlet缺少另一个必需的类。哪些罐子需要存在于WEB-INF lib和.classpath中

我对于不同的应用程序有类似的问题,并且在尝试了几次“排除”jar之后,我能够在WAS中成功部署应用程序。我有以下问题。

  1. 我们怎样才能确定所有jar需要在WEB-inf \ lib文件夹中出现?

  2. 我们如何确定所有罐子需要在战争meta-inf的.class路径中出现。

  3. 我们怎么能确定,即使罐子中的.classpath提及,但并非强制性的,它需要存在于WEB-INF \ lib中(即类加载器将拉动从耳朵而不是战争)的战争将工作

仅供参考我使用J2EE 1.4

回答

2
在集装箱执行

Java EE应用程序有几个层次组成的类路径:

  1. Web应用程序的类路径,repres由JAR和类文件ented包含在WEB-INF/lib中
  2. 企业应用的类路径,其包括在EAR水平
  3. 容器类路径声明的JAR文件,包含WebSphere运行时和共享库

有是这些级别之间复杂的依赖关系规则,但主要思想是所有应用程序库必须包含在这些级别之间,以避免可能破坏类路径的任何冲突。

考虑到这一点,一个简单的方法是将所有的应用程序JAR放在WEB-INF/lib中。如果你的EAR有两个Web模块,每个模块都需要它自己的一套JARS。一个更强大的方法是将常用的JAR包含在EAR级别,这样可以避免JAR的重复性。

如果您的公司有一个所有应用程序都使用的专有框架,那么在公司的每个EAR应用程序中都包含相同的JARS是很愚蠢的。更好的方法是将公司框架配置为Container中的共享库,以便所有应用程序都可以重复使用它。

总之,确定Java EE应用程序类路径有几个因素。你应该记住总是避免重复和版本冲突,所以你的应用可以顺利地解决它的依赖关系。

+0

嗨卡洛斯非常感谢您的建议。这是我正在运行的。 1.如果我是对的,那么在耳朵和战争中复制罐子都会导致课堂加载问题。 2.例如,如果我在我的web-inf lib中使用了struts.jar这样的jar,那么避免ear和war中的重复的最好方法是什么,因为struts可能会引入一些额外的传递依赖jar。所以如果我们排除其他传递性依赖关系在部署说明所需类之后失败,但在调用struts时不可用。我仍然有这个问题,我不知道如何解决这个问题。 – techrawther 2012-03-13 01:35:49

+0

您的企业应用程序有多少个Web模块?如果它只有一个模块,那么最好的办法就是将Struts及其所有依赖关系放在WEB-INF库中,这样就不会混淆其他模块的类路径 – 2012-03-13 02:13:00

+0

我有3个Web模块并复制了所有的jar文件所有的3个战争文件将会占用空间。 – techrawther 2012-03-15 01:26:18