在一个EAR中部署多个依赖的CDI jar

时间:2013-04-11 12:11:34

标签: java java-ee deployment cdi ear

我有一个关于如何部署包含CDi实现和webapp的多个jar的问题。

这是我的Jar结构

--------     ----------      ------------
| WAR  | <-- | API Jar | <-- | Data Jar |
--------     ----------      ------------ 
                  ^
                  |
           --------------  
           | Common Jar |    And many more implementations
           --------------                  

WAR本身就是使用API​​ Jar中定义的类的webapp。 API jar只包含接口,注释,非逻辑类,限定符等......

API的实现存储在不同的JAR中,按专题分割。因此,所有数据访问/操作数据,安全性,日志记录,常见等实现。此实现依赖于API Jar和Libraries。所有包都通过事件进行通信。

我们在每个实现和webapp中都使用CDI。完整配置仅在WAR中。

我想在一个EAR中部署所有内容。所以这是我使用的文件结构:

EAR
  - META-INF/application.xml
  - api.jar
    - api classes, no beans.xml here
  - common.jar
    - api implementation for common project classes
    - META-INF/beans.xml
  - data.jar
    - api implementation for data classes
    - META-INF/beans.xml
  - logging.jar
    - api implementation for logging classes
    - META-INF/beans.xml
  - webapp.war
    - classes 
      - ( project classes which uses the api)
      - META-INF
        - services
        - persistence.xml
    - WEB-INF/beans.xml
      - beans.xml
      - web.xml

我的application.xml看起来像这样:

<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>test-ear</display-name>
  <module>
    <java>api-1.0.0.jar</java>
  </module>
  <module>
    <java>common-package-1.0.0.jar</java>
  </module>
  <module>
    <java>data-package-1.0.0.jar</java>
  </module>
  <module>
    <java>logging-package-1.0.0.jar</java>
  </module>
  <module>
    <web>
      <web-uri>test-war-1.0.0.war</web-uri>
      <context-root>/war</context-root>
    </web>
  </module>
</application>

我现在的问题是,这根本不起作用。 CDI Container抱怨错过了一些豆子。我搜索了谷歌,并发现包含beans.xml的罐子被部署为ejbModule,但在这里我需要为所有东西创建一个ejb.jar。另一个结果说我只需要将所有依赖项添加到WEB-INF / lib中的WAR文件中。同样的抱怨在这里

我无法运行并尝试在此处请求帮助。

作为服务器我想使用websphere(也许是tomee)。

编辑:Maven用于将所有文件组合在一起。

非常感谢,如果有人可以帮助我:)

2 个答案:

答案 0 :(得分:0)

你是否试图在战争清单中引用你的罐子?

Class-Path: api.jar data.jar logging.jar common.jar

这样的东西

答案 1 :(得分:0)

添加到Gab的答案,添加webapp.war的manifest类路径 使用<optional>true</optional>如下

<dependency>
    <groupId>common</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <optional>true</optional>
</dependency>

https://maven.apache.org/plugins/maven-war-plugin/examples/war-manifest-guide.html