Weblogic升级到12c:部署失败,因为URL映射到多个Servlet。

9

我最近搭建了一个新的Weblogic 12c环境。在部署一个我知道在Weblogic 11g中可用的应用程序时,我遇到了错误"web应用程序中的url-pattern /resources/* 映射到多个Servlets."

它所指的映射是在被部署的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)

3
你是否解决了这个问题?我现在也遇到了同样的问题。 - OldProgrammer
4个回答

4
如果您在Java代码中使用Web注释,就不必再在web.xml文件中声明servlet了。
您可以尝试删除web.xml中相应的"servlet"和"servlet-mapping"标记。
似乎WebLogic 12.1.3可以处理双重声明(内联注释和XML),但在WebLogic 12.2中不再支持。
当我指定"serviceName"参数并在web.xml文件中声明具有相同值的servlet时,我在@webservice注释中遇到了这个错误。

0
问题在12.1.3版本中不存在(这恰好是我们要升级的版本)。

0

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


0

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

有三种可能的解决方案:

在我们的情况下,问题是来自于类路径扫描Web服务组件,以及在webservices-rt jar中找到带注解的服务。需要关闭该扫描。 如果您的Web应用程序没有任何注解,并且版本设置为2.5或更高版本,可以将web.xml描述符中的metadata-complete属性设置为true,以避免对Web应用程序类进行不必要的注解扫描。例如:
<?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应用程序的注解处理和依赖注入。 在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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接