无法在 WebLogic 上的 EAR 中部署 WAR

Unable to deploy WAR in an EAR on WebLogic

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

我有一个简单的 java class 并尝试使用 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;

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

似乎任何 bean 都已经在 bean 服务器中注册了名称 "appContext"。

明确提供不同的 bean 名称或更改 class 名称。

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

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

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

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

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

取自具有公认答案的相同问题 -