返回

TomEE部署WAR包:利用AssemblyDescriptor排除JAR包

java

在TomEE环境中部署WAR包时,我们常常会遇到需要排除特定JAR包的场景。这种情况尤其常见于使用“胖JAR包”——即包含所有依赖库的WAR包——进行部署时。这些需要排除的JAR包可能只包含了一些库类,而没有需要TomEE部署的bean。TomEE提供了一种机制,允许我们在conf/exclusion.list文件中配置需要排除的JAR包。

但是,依靠exclusion.list文件来配置排除项并不是最理想的解决方案。因为它要求在部署WAR包的每一台服务器上都进行相同的配置,增加了部署的复杂度和维护成本。有没有一种方法,能够在构建WAR包或JAR包的时候就标记出需要排除的JAR包呢?

答案是有的。我们可以借助org.apache.openejb.jee.AssemblyDescriptor类的excludeList属性来达到这个目的。AssemblyDescriptor是OpenEJB用来模块结构的符,其中的excludeList属性可以用来指定需要排除的JAR包。

如何设置AssemblyDescriptorexcludeList属性呢?

一种方法是通过编程的方式创建AssemblyDescriptor对象,并设置它的excludeList属性。比如:

AssemblyDescriptor assemblyDescriptor = new AssemblyDescriptor();
assemblyDescriptor.getExcludeList().add("my-library.jar");

之后,将这个AssemblyDescriptor对象添加到WAR包或JAR包的元数据中。

另一种方法是使用Maven插件来设置AssemblyDescriptorexcludeList属性。我们可以使用openejb-maven-plugin插件来实现这个目标。在项目的pom.xml文件中添加如下配置:

<plugin>
  <groupId>org.apache.openejb</groupId>
  <artifactId>openejb-maven-plugin</artifactId>
  <version>...</version>
  <configuration>
    <assemblyDescriptor>
      <excludeList>
        <exclude>my-library.jar</exclude>
      </excludeList>
    </assemblyDescriptor>
  </configuration>
</plugin>

这样,在构建WAR包或JAR包的时候,openejb-maven-plugin插件会自动创建AssemblyDescriptor对象,并设置它的excludeList属性。

为什么不直接在web.xml中标记排除项?

尽管web.xml是WAR包的部署描述符,但它并不支持直接标记需要排除的JAR包。web.xml主要用于配置Servlet、Filter、Listener等Web组件,以及一些其他的Web应用程序相关的配置。

为什么不标记JAR包中的所有bean呢?

在某些情况下,我们可能只想排除JAR包中的部分bean,而不是全部。例如,JAR包中可能包含了一些工具类,这些工具类不需要被OpenEJB管理。如果我们标记了JAR包中的所有bean,那么这些工具类也会被排除掉,这可能会导致应用程序出现问题。

通过使用AssemblyDescriptorexcludeList属性,我们可以精确地控制需要排除的JAR包,避免不必要的麻烦。这种方式不仅简化了部署过程,还提高了应用程序的可维护性。

需要注意的是,AssemblyDescriptorexcludeList属性只对OpenEJB有效。如果我们使用其他的应用服务器,例如Tomcat或WildFly,我们需要使用其他的方式来排除JAR包。

总而言之,在构建WAR包或JAR包时,我们可以利用AssemblyDescriptorexcludeList属性来排除不需要部署的JAR包。这种方式能够简化部署过程,提升应用程序的可维护性,并且能够精确地控制需要排除的JAR包。

常见问题及解答:

  1. AssemblyDescriptor是什么?
    AssemblyDescriptor是OpenEJB用来描述模块结构的描述符,它包含了模块的名称、类路径、依赖关系等信息。

  2. 如何查看WAR包或JAR包中的AssemblyDescriptor
    可以使用解压缩软件打开WAR包或JAR包,然后查看META-INF目录下的openejb-jar.xml文件。

  3. 除了excludeList属性,AssemblyDescriptor还有哪些其他的属性?
    AssemblyDescriptor还有很多其他的属性,例如applicationExceptionPolicysecurityRoleReferenceejbLocalReference等。

  4. 如果我想排除多个JAR包,应该怎么做?
    可以在excludeList中添加多个exclude元素,每个exclude元素对应一个需要排除的JAR包。

  5. 如果我想排除JAR包中的某个特定的类,应该怎么做?
    excludeList只能排除整个JAR包,不能排除JAR包中的某个特定的类。如果想排除JAR包中的某个特定的类,可以使用其他的方法,例如在应用程序的配置文件中进行配置。