0

我有一个具有以下结构的 JavaEE6 应用程序:

app.ear
  META-INF
    application.xml
  lib
    commmon-server-lib.jar
  webapp1.war
  webapp2.war
  services-ejb.jar

两个 webapps 在它们的 MANIFEST.MF(瘦战)的 Class-Path 条目中都有 common-server-lib.jar。

应用程序.xml:

<application>
  <module>
    <ejb>services-ejb.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>webapp1.war</web-uri>
      <context-root>/webapp1</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>webapp2.war</web-uri>
      <context-root>/webapp2</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

其中common-server-lib.jar有一个 Web 过滤器,应该注入很少的 EJB 和其他 CDI 托管 bean。这个过滤器是在web.xml两个 webapps 中定义的。

common-server-lib.jar和战争已经beans.xml在适当的地方。

现在的问题是,当我尝试将此应用程序部署到 Glassfish 时,会出现如下错误:

Class [ Lcom/acme/UserService; ] not found. Error while loading 
    [ class com.acme.filter.MyFilter ]

UserService服务位于 services-ejb.jar

所以我的问题是:我做错了什么......?在共享库中定义 Web 组件(对其依赖项使用注入)有什么问题吗?

编辑:

在 JSR-315(Servlets 3.0 最终规范)的第 15.5 节中,可以找到:

In a web application, classes using resource injection will have their annotations
processed only if they are located in the WEB-INF/classes directory, or if they are
packaged in a jar file located in WEB-INF/lib.

我已将 common-server-lib.jar 移至两个 webapps 的 WEB-INF/lib 目录,但我仍然遇到同样的问题;/...

4

1 回答 1

0

经过数小时的努力解决这个难题后,我找到了解决方案:

  1. 添加web-fragment.xmlcommmon-server-lib.jar我的过滤器
  2. 从 webapps 中删除过滤器web.xml规范
  3. 更改 Maven 配置以从WEB-INF/lib 目录中删除所有 jar,除了commmon-server-lib.jar
  4. commmon-server-lib.jar从 EAR/lib目录中删除
于 2013-03-12T12:47:32.467 回答