0


我们有一个“旧的”JavaEE 应用程序,我们希望将它从旧的 Sun Application Server 9.1 移植到当前的 Glassfish 3.1。我们更新了部署描述符 xml 文件(重命名它们,更新了 DocType,针对 DTD 进行了验证,仅此而已)。但是当我们尝试部署到 GF3.1 时,我们得到了这个错误:

JDO83008: CMP Compilation failed: 
C:\workspace\glassfish31eclipsedefaultdomain\generated\ejb\archivetool-app-1.9.5\archivetool-ejb-1.9.5_jar\de\ems\archivetool\ejb\metadata\cd\eb\CdBean_821611534_ConcreteImpl.java:10: 
cannot access de.ems.archivetool.ejb.framework.AbstractCMPBean
class file for de.ems.archivetool.ejb.framework.AbstractCMPBean not found

C:\workspace\glassfish31eclipsedefaultdomain\generated\ejb\archivetool-app-1.9.5\archivetool-ejb-1.9.5_jar\de\ems\archivetool\ejb\productdata\product\eb\ProductionLibraryBean40992531_ConcreteImpl.java:416: 
cannot find symbol

symbol  : class EBSBusinessException
location: package de.ems.archivetool.ejb.framework

WARNUNG: JDO83004: CMP Compilation failed. See log for details.
SCHWERWIEGEND: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer prepare method
SCHWERWIEGEND: Exception while invoking class org.glassfish.javaee.full.deployment.EarDeployer prepare method
SCHWERWIEGEND: Exception while preparing the app
SCHWERWIEGEND: JDO83004: CMP Compilation failed. See log for details.
org.glassfish.deployment.common.DeploymentException: JDO83004: CMP Compilation failed. See log for details.

但是我们仍然可以部署在旧的 SUN App Server 中。

该应用程序由 4 个模块和一个构建模块组成。通常,.ear 文件由两个 EJB 模块、一个 WAR 模块和一个 JAR 模块组成,使用 Maven 构建没有问题(UnitTest 成功等)。(pom.xml和生成的application.xml

所以,一切都很好,但是当我们尝试将应用程序部署到 GF3.1 时,我们得到“找不到类文件”错误。未找到的类在 JAR 模块中,并包含 EJB 模块的基类。

有人有起点吗?

问候, 安德烈亚斯

4

1 回答 1

0

好的,经过几个小时的谷歌搜索,我终于在这里找到了这个问题的确切答案。重要的部分是:

Java EE 6 规范对企业归档 (EAR) 文件中可以看到哪些 JAR 文件施加了严格的规则。参见 EE.8.3.3 节;具体来说,应用程序客户端模块不应访问任何 EJB JAR 文件,除非应用程序客户端 JAR 文件的清单类路径明确引用 EJB JAR 文件。

这是对 GlassFish Server v2 的更改,其中应用程序客户端自动可以访问 EAR 文件中的所有 EJB JAR 文件以及 EAR 文件顶层的所有 JAR 文件。为了符合更严格的规范语言,GlassFish Server 3.0.1 无法自动为应用程序客户端提供对这些 JAR 文件的访问权限。

你要做的是,让 maven 将 jar(和其他依赖项)放入 ear 容器中的 library 文件夹中。您可以通过将其添加到您的 ear pom.xml 中来做到这一点:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-ear-plugin</artifactId>
      <configuration>

      //here starts the important part
      <defaultLibBundleDir>lib</defaultLibBundleDir>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
        </manifest>
      </archive>
      //end of important part

   <modules>
     <jarModule>
       <groupId>gID</groupId>
       <artifactId>aID</artifactId>
     </jarModule>

     //etc some more ebjs, war, ...
   </modules>

这会将 jar 模块放入文件夹 lib,所有依赖的 ejb 都将在其 MANIFEST.MF 中获得 Class-Path 条目。

希望能帮助你们中的一些人解决同样的问题。

于 2012-04-20T12:22:07.953 回答