【问题标题】:Why we have to declare dependencies on manifest of JBOSS 8 (wildfly)?为什么我们必须声明对 JBOSS 8 (wildfly) 清单的依赖?
【发布时间】:2014-10-07 19:32:36
【问题描述】:

给定以下 EAR:

  • my-app.ear
    • my-ejb.jar
    • my-webapp.war
      • my-lib.jar

my-ejb 需要 oracle 库来处理 oracle 空间,以便构建几何图形和存储数据。 JBOSS 8(wildfly)正确加载了oracle的模块。

当我启动应用程序时,我收到了ClassNotFoundException oracle.sql.STRUCT

好的,我在my-ejb META-INF/manifest.mf上添加了oracle驱动ojdbc6.jar的依赖。

Class-Path: ojdbc6.jar
Dependencies: oracle.sql 

当我启动应用程序时,我收到了ClassNotFoundException oracle.sql.StructDescriptor。我知道当我从结果集中读取数据时,从结果集中出来的对象是 oracle.sql.STRUCT 类的实例,但 oracle.sql.StructDescriptor 在同一个包中。

好的,我在 my-lib META-INF/manifest.mf 上添加了相同的 oracle 驱动程序 ojdbc6.jar 依赖项。

而且它有效!

我的问题是

  • 清单在 JBOSS 8 上的作用是什么?
  • 为什么在 oracle weblogic 上我不需要在 manifest.mf 上添加这些依赖项?

【问题讨论】:

    标签: java oracle jboss wildfly manifest.mf


    【解决方案1】:

    Santosh 给出了正确的回应,但让我澄清一些关于 weblogic 与 jboss 的问题。

    JBOSS 和 WebLogic 有不同的类加载器机制。让我澄清一下:

    1.为什么要显化?

    Java-Oracle 回复:您可能需要在 JAR 文件中引用其他 JAR 文件中的类。

    2。为什么要在 EAR/WAR 应用程序上显示?

    Oracle Weblogic 回复:WebLogic Server 支持可选包,如 Java EE 5.0 规范第 8.2 节可选包支持中所述,版本控制在可选包版本中描述。可选包提供与 Java EE 库类似的功能,允许您在多个应用程序之间轻松共享单个 JAR 文件。与 Java EE 库一样,可选包必须首先通过将关联的 JAR 文件部署为可选包来向 WebLogic Server 注册。注册包后,您可以部署在其清单文件中引用该包的 Java EE 模块。

    可选包与 Java EE 库不同,因为可选包可以从任何 Java EE 模块(EAR、JAR、WAR 或 RAR 存档)或展开的存档目录中引用。 Java EE 库只能从有效的企业应用程序中引用。

    [...]

    任何 Java EE 应用程序或模块都可以引用可选包(使用 META-INF/MANIFEST.MF),而只有企业应用程序和 Web 应用程序可以引用共享 Java EE 库(使用 weblogic-application.xml 或 weblogic.xml )

    3.那为什么我们不用声明 java-ee-api.jar, jsf, jsp, ...

    Jboss 回复:下表列出了作为依赖项自动添加到部署中的模块以及触发依赖项的条件。

    Implicit_Module_Dependencies

    4.不是所有的模块都被 JBOSS 加载了吗?

    Jboss 回复:本章将讨论打包为 jar 的应用程序如何声明它们依赖于一个或多个模块:

    Dependencies: oracle.sql, another.module.with.version:1.0
    

    Manifest module information

    4.1 或者定义jboss-deployment-structure.xml

    <jboss-deployment-structure>
    
       <deployment>
    
          <dependencies>
             <module name="oracle.sql" export="TRUE" />
          </dependencies>
    
       </deployment>
    
    </jboss-deployment-structure>
    

    Add anExplicit Module Dependency to a Deployment

    4.2 与 maven

    <plugins>
    
       <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <configuration>
             <archive>
                <manifestEntries>
                   <Dependencies>org.javassist, org.apache.velocity</Dependencies>
                </manifestEntries>
             </archive>
          </configuration>
       </plugin> 
    
    </plugins>
    

    见:Generate MANIFESTMF entries using Maven

    见:How do you generate module dependencies in MANIFEST.MF for JBoss AS 7 with maven?

    7.为什么我们之前没有得到这些重要信息?

    使用新的组织模型,JBOSS 7/8 放弃了著名的类加载层次结构,转而使用基于模块化单元的更简单的模型 (JBoss Modules Project)。架构模块的引入(除了即将在 JDK 中引入,由于 OSGi 等外部项目,此时非常流行)实际上扩展了用于封装 Java EE 应用程序的模型;然后,一个模块可以是一个库、一个类的集合,或者更一般地说是与单个类加载器相关联的资源的集合:因此,与过去不同的是,类加载器是在一组类的分层组织下收集的,点这里的观点正好相反。

    见:Class Loading in WildFly

    【讨论】:

      【解决方案2】:

      回答你的问题:

      • 清单在 JBOSS 8 上的作用是什么?

      每当创建 jar 档案时,就会自动创建清单。没有与 JBOSS 8 相关的特定角色,而是它的一般用途。在特定情况下,如果一个 jar 说 file1.jar 依赖于属于其他 jar 的一些类,比如 file2.jar 文件,那么这些 jar 应该在file1.jar 正在加载。现在的诀窍是,每当类加载器加载 jar 文件时,清单是一种告诉类加载器加载该 jar 需要的其他 jar 的方法。 (Check this link) 这就是当清单中缺少 ojdbc6.jar 时您的代码无法工作的原因。

      • 为什么在 oracle weblogic 上我不需要在 manifest.mf 上添加这些依赖项?

      嗯,这是因为在 oracle weblogic 中,ojdbc6.jar 与 weblogic 服务器捆绑在一起,并且在服务器启动时已经加载。请注意,即使您在应用程序中捆绑了 ojdbc6.jar,它也不会被使用。这是relevant documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 2011-10-15
        相关资源
        最近更新 更多