【问题标题】:Unable to deploy WAR in an EAR on WebLogic无法在 WebLogic 上的 EAR 中部署 WAR
【发布时间】:2017-03-17 19:39:23
【问题描述】:

我有一个 Web 应用程序在 WebLogic 应用程序服务器 12.2.1.1 上的 JSF 2.2 上运行。

我有一个简单的 java 类,并尝试使用 CDI 将其初始化为 ApplicationScoped 对象。这可以完美地部署为 WAR。

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@Named
@ApplicationScoped
public class AppContext {
    public AppContext() {
    }
}

但是,当我将此 WAR 添加到 EAR 时,它无法部署。我正在尝试所有可能的解决方案,目前似乎没有任何效果。异常日志如下:

weblogic.management.DeploymentException: CDI deployment failure:WELD-001414: Bean name is ambiguous. Name appContext resolves to beans: [Managed Bean [class beans.AppContext] with qualifiers [@Default @Any @Named], Managed Bean [class beans.AppContext] with qualifiers [@Default @Any @Named]]:org.jboss.weld.exceptions.DeploymentException:WELD-001414: Bean name is ambiguous. Name appContext resolves to beans: [Managed Bean [class beans.AppContext] with qualifiers [@Default @Any @Named], Managed Bean [class beans.AppContext] with qualifiers [@Default @Any @Named]]
    at org.jboss.weld.bootstrap.Validator.validateBeanNames(Validator.java:641)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:487)
    at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:446)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90)
    at com.oracle.injection.provider.weld.WeldInjectionContainer.start(WeldInjectionContainer.java:150)
    Truncated. see log file for complete stacktrace

还有WEB-INF\beans.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_1_0.xsd">
</beans>

应用程序运行于:

NetBeans IDE 8.2;
JDK 1.8 b121;
Mojarra JSF 2.2;
WebLogic 12.2.1.1;

非常感谢任何有关解决此问题的提示。

【问题讨论】:

标签: deployment war jsf-2.2 weblogic12c ear


【解决方案1】:

恕我直言:从上下文初始化的角度来看,这看起来像是一个问题,即 EAR 类加载器将 bean 加载到上下文中,而 WAR 也将 bean 再次加载到上下文中。请查看此博客CDI in EARs,以便更清楚地了解它。一些 J2EE 服务器自己管理它。请检查您的应用程序的打包方式以及部署方式。

了解有关类加载检查的其他信息:

  1. Understanding WebLogic Server Application Classloading
  2. Application.xml WAR EJB.jar Module order can cause ClassLoader issues

【讨论】:

    【解决方案2】:

    它作为独立 WAR 部署但作为 EAR 失败的事实是问题的一个相当明确的指标。应用程序包含来自外部库的具有相同 bean 名称的对象,或者该类本身已复制到 EAR 中的其他位置。检查您没有将此类(或包含此类的 jar)加载到 EAR 中的任何其他位置;想到了APP-INF。如果您还没有,确定它是外部库还是您自己的部署路径的最快方法是将类重命名为您可以确保是唯一的(例如 MyUniqueBeanName)。如果重命名后问题仍然存在,则很可能是您的部署。

    【讨论】:

      【解决方案3】:

      从 EAR 中删除 WAR 并单独部署它。出于某种原因,将 WAR 打包到 EAR 中并部署失败。不确定这是否是 WebLogic 或 EAR 配置的问题。

      取自与已接受答案相同的问题 - Initializing CDI Bean Name Ambiguous

      【讨论】:

        【解决方案4】:

        似乎任何 bean 都已在 bean 服务器中以名称“appContext”注册。

        要么显式提供不同的 bean 名称,要么更改类名。

        【讨论】:

        • 至少给出一个反对的理由,这样如果我错了我可以纠正
        • 感谢您的回复!没有其他同名的类。事实上,这是我整个测试网络项目中唯一的一个类。这是添加到新 EAR 项目中的唯一 WAR 项目。我仍然得到相同的部署异常。我猜这可能是 WebLogic WELD 库的问题。
        • 可能您的应用程序中没有创建任何此类,但任何库都可能包含具有此名称的任何类。可能是我错了,但重命名类或为其显式提供 bean 名称并测试应用程序只需要一点努力。
        • 在发布问题之前,我已经尝试了各种名称。在@Named 中也显式命名它,结果仍然相同。
        猜你喜欢
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多