Weblogic 升级到 12c:部署失败,因为 url 映射到多个 servlet

Posted

技术标签:

【中文标题】Weblogic 升级到 12c:部署失败,因为 url 映射到多个 servlet【英文标题】:Weblogic upgrade to 12c: deployment fails because url mapped to multiple servlet 【发布时间】:2016-11-06 08:53:07 【问题描述】:

我最近设置了一个新的 Weblogic 12c 环境。在部署我知道在 Weblogic 11g 中工作的应用程序时,我收到错误 “Web 应用程序中的 url-pattern /resources/* 映射到多个 Servlet。”

它所指的映射位于正在部署的 application.ear 内的 web.xml 中,但它只映射一次:

  <servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping> 

该项目不包含对 url 模式 /resources/* 的任何其他引用,有人可以解释重复映射的来源以及我如何解决它吗?

我能找到的最接近的问题是:https://bugster.forgerock.org/jira/si/jira.issueviews:issue-html/OPENAM-7947/OPENAM-7947.html,它已被标记为不可重现。

部署的完整堆栈跟踪:

<Error> <Deployer> <BEA-149205> <Failed to initialize the application "<application_name>" due to error weblogic.application.ModuleException: weblogic.management.DeploymentException: [HTTP:101401]The url-pa
ttern /resources/* in web application <application_name> is mapped to multiple Servlets.
weblogic.application.ModuleException: weblogic.management.DeploymentException: [HTTP:101401]The url-pattern /resources/* in web application <application_name> is mapped to multiple Servlets.
        at weblogic.application.internal.ExtensibleModuleWrapper.prepare(ExtensibleModuleWrapper.java:114)
        at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:100)
        at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:192)
        at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:187)
        at weblogic.application.utils.StateMachineDriver$ParallelChange.run(StateMachineDriver.java:83)
        at weblogic.application.utils.StateMachineDriver.nextStateInParallel(StateMachineDriver.java:144)
        at weblogic.application.internal.flow.ModuleStateDriver.parallelPrepare(ModuleStateDriver.java:46)
        at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:75)
        at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:55)
        at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:731)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
        at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:243)
        at weblogic.application.internal.EarDeployment.prepare(EarDeployment.java:66)
        at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:158)
        at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:65)
        at weblogic.deploy.internal.targetserver.AppDeployment.prepare(AppDeployment.java:158)
        at weblogic.management.deploy.internal.DeploymentAdapter$1.doPrepare(DeploymentAdapter.java:41)
        at weblogic.management.deploy.internal.DeploymentAdapter.prepare(DeploymentAdapter.java:193)
        at weblogic.management.deploy.internal.AppTransition$1.transitionApp(AppTransition.java:31)
        at weblogic.management.deploy.internal.ConfiguredDeployments$2.doItem(ConfiguredDeployments.java:684)
        at weblogic.management.deploy.internal.parallel.BucketInvoker.invoke(BucketInvoker.java:138)
        at weblogic.management.deploy.internal.ConfiguredDeployments.transitionAppsParallel(ConfiguredDeployments.java:692)
        at weblogic.management.deploy.internal.ConfiguredDeployments.prepare(ConfiguredDeployments.java:322)
        at weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:202)
        at weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:207)
        at weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:129)
        at weblogic.server.AbstractServerService.postConstruct(AbstractServerService.java:76)
        at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1262)
        at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:332)
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:374)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:232)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:85)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2020)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
        at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:666)
        at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
        at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
        at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
        at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
        at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)

【问题讨论】:

您解决了这个问题吗?我现在也有同样的问题。 【参考方案1】:

尝试删除在 12.2 升级后添加的 FATP jar。这对我有用。

【讨论】:

【参考方案2】:

Weblogic 12.2.1.3 版在某些情况下会自动将 JAX-RS servlet 注册到路径 /resources/*(例如,像 jackson-jaxrs-json-provider 这样的依赖项通过 annotation/spi/moduleinfo “请求”它)。但是,如果此路径已被另一个服务注册,则会引发上述错误。

可以尝试 3 种可能的解决方案:

    在我们的例子中,问题来自于对 Web 服务组件的类路径扫描,以及在 webservices-rt jar 中找到带注释的服务。该扫描需要关闭。 如果您的 Web 应用程序没有任何注释并且您将版本设置为 2.5 或更高版本以避免不必要地扫描 Web 应用程序类以查找注释,则在 web.xml 描述符中将 metadata-complete 属性设置为 true。例如

    <?xml version="1.0" encoding="UTF-8"?>
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
      version="4.0"
      metadata-complete="true">
      <servlet>
       <servlet-name>sample</servlet-name>
       <servlet-class>Sample</servlet-class>
      </servlet>
      <servlet-mapping>
       <servlet-name>sample</servlet-name>
       <url-pattern>/sample</url-pattern>
      </servlet-mapping>  
    </web-app>
    

    或者,您可以通过在启动 WebLogic Server 时设置 -Dweblogic.servlet.DIDisabled=true 标志来关闭所有 Web 应用程序的注释处理和 DI。

    在 web.xml 中为 jersey 注册另一个路径,例如/jersey/*

    <servlet>
     <servlet-name>Jersey Web Application</servlet-name>
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    </servlet>
    <servlet-mapping>
     <servlet-name>Jersey Web Application</servlet-name>
     <url-pattern>/jersey/*</url-pattern>
    </servlet-mapping> 
    

【讨论】:

【参考方案3】:

如果在java代码中使用web注解,就不用再在web.xml文件中声明servlet了。

你可以试试去掉web.xml中对应的“servlet”和“servlet-mapping”标签

WebLogic 12.1.3 似乎可以处理双重声明(内联注释和 xml),但在 WebLogic 12.2 中不再适用。

当我指定“serviceName”参数以及在 web.xml 文件中声明具有相同值的 servlet 时,@webservice 注释出现此错误。

【讨论】:

【参考方案4】:

12.1.3 版(恰好是我们打算升级到的版本)中不存在该问题。

【讨论】:

以上是关于Weblogic 升级到 12c:部署失败,因为 url 映射到多个 servlet的主要内容,如果未能解决你的问题,请参考以下文章

基于ant自动部署ear/war 文件到weblogic12c

如何通过wlst部署应用程序到weblogic12c上

oracle weblogic 11g和 12c的区别

Weblogic 12c 数据源高计数连接

weblogic12c部署遇到的问题和解决

Weblogic 12c 上的 Spring SAML