【问题标题】:GlassFish 3.1.2.2 war can't find jar inside earGlassFish 3.1.2.2 战争在耳朵内找不到罐子
【发布时间】:2012-08-24 15:25:50
【问题描述】:

我已经用这种结构构建了一个耳朵(此处未显示所有文件):

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)它并未加载到类路径中规范说它应该被加载到类路径中。

【问题讨论】:

  • 仅在war-pom 中将myapp-common.jar 设置为provided,并让myapp-common.jarejb-pom 中具有默认范围。这对我有用。

标签: java jakarta-ee glassfish java-ee-6 glassfish-3


【解决方案1】:

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

所以教训是:如果您看到ClassNotFoundException,请同时查看您的 taglib.xml 文件。

【讨论】:

    【解决方案2】:

    验证你的war文件中有META-INF/manifest.mf,包含(类似的东西):

    Manifest-Version: 1.0
    Class-Path: lib/myapp-common.jar
    

    【讨论】:

    • 它不存在。问题是,我必须在 ejb-jar 和 war 中将 Maven 中的依赖项声明为 &lt;scope&gt;provided&lt;/scope&gt; ,否则 ejb-jar 和 war 都会有一个 jar,很可能还有耳朵。 maven-ear-plugin 跳过以这种方式声明的相对于清单中的类路径的依赖项。
    • 实际上,这些 Class-Path 条目不是必需的。 blogs.oracle.com/alexismp/entry/packaging_libraries_with_ears
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2011-09-11
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多