为什么我们必须在JBOSS 8(wildfly)的清单上声明依赖?

giu*_*usy 4 java oracle jboss manifest.mf wildfly

给出以下EAR:

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

my-ejb需要oracle库与oracle空间一起工作才能构造几何并存储数据.JBOSS 8(wildfly)正确加载了oracle的模块.

当我开始申请时,我收到了ClassNotFoundException oracle.sql.STRUCT.

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

Class-Path: ojdbc6.jar
Dependencies: oracle.sql 
Run Code Online (Sandbox Code Playgroud)

当我开始申请时,我收到了ClassNotFoundException oracle.sql.StructDescriptor.我知道当我从结果集读取数据时,结果集中出现的对象是oracle.sql.STRUCT类的实例,但oracle.sql.StructDescriptor它位于同一个包中.

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

它的工作原理!

我的问题是

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

ven*_*iac 14

Santosh给出了正确的答案,但让我澄清一些关于weblogic vs jboss的问题.

JBOSS和WebLogic具有不同的classoader机制.让我澄清一下:

为什么表现出来?

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),而只有Enterprise Applications和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
Run Code Online (Sandbox Code Playgroud)

清单模块信息

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

<jboss-deployment-structure>

   <deployment>

      <dependencies>
         <module name="oracle.sql" export="TRUE" />
      </dependencies>

   </deployment>

</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)

向部署添加显式模块依赖关系

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>
Run Code Online (Sandbox Code Playgroud)

请参阅:使用Maven生成MANIFESTMF条目

请参阅:如何使用maven在MANIFEST.MF中为JBoss AS 7生成模块依赖项?

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

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

请参阅:WildFly中的类加载


San*_*osh 8

回答你的问题:

  • 哪个是表现在JBOSS 8上的作用?

每当创建jar存档时,都会自动创建清单.没有与JBOSS 8相关的特定角色,但是它的一般用途.在特殊情况下,如果jar说file1.jar依赖于属于某些其他jar的文件,例如file2.jar文件,则应该在加载file1.jar时加载这些jar .现在的诀窍是,每当一个jar文件由类加载器加载时,manifest就是告诉类加载器加载这个jar需要的其他jar的方法.(检查此链接)这是清单中缺少ojdbc6.jar时代码不起作用的原因.

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

好吧,这是因为在oracle weblogic中,ojdbc6.jar与weblogic服务器捆绑在一起,并且在服务器启动时已经加载.请注意,即使您在应用程序中捆绑了ojdbc6.jar,也不会使用它.以下是相关文档.