0

我已经用这种结构建立了一个耳朵(不是这里显示的所有文件):

myapp.ear/
    myapp-ejb.jar
    myapp-web.war
    META-INF/
        application.xml
    lib
        myapp-common.jar

问题是,当战争中的代码试图引用 myapp-common.jar 中的类时,它会抛出java.lang.ClassNotFoundException.

注意 的内容META-INF/application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                 http://java.sun.com/xml/ns/javaee/application_6.xsd"
             version="6">
  <display-name>pncr-portal-ear</display-name>
  <module>
    <web>
      <web-uri>myapp-web.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
  <module>
    <ejb>myapp-ejb.jar</ejb>
  </module>
  <library-directory>/lib</library-directory>
</application>

库目录在此处定义为/lib相对于耳朵根目录的目录,这正是它所在的位置,但它并未加载到类路径中,尽管 Java EE 5(可能是 6)规范说它应该是加载到类路径中。

4

2 回答 2

0

事实证明,我在一个与我想象的略有不同的包中引用了一个类。该包不再存在,但 Maven 正在编译它而没有抱怨。所以我吹走了我的本地存储库并再次尝试。我仍然得到错误。然后我发现了问题:在 myapp.taglib.xml 中,我仍在引用 myapp-common.jar 中的旧版本的类,该类现在位于不同的包中。

所以教训是:如果你看到ClassNotFoundException,还要查看你的 taglib.xml 文件。

于 2012-08-24T07:25:50.183 回答
-1

验证META-INF/manifest.mf您的 war 文件中是否包含(类似于):

Manifest-Version: 1.0
Class-Path: lib/myapp-common.jar
于 2012-08-24T05:55:02.627 回答