OpenSAML 仅在 weblogic 上抛出 java.lang.NoClassDefFoundError

问题描述 投票:0回答:1

我正在尝试使用 opensaml 库实现 SAML SSO。我设法这样做并成功地在 tomcat 7 上部署了我的简单授权请求但是当我将我的应用程序移动到 weblogic 服务器 10.3.5 时它抛出以下错误:

java.lang.NoClassDefFoundError: Could not initialize class org.opensaml.xml.XMLConfigurator

我使用 Gradle 1.12 构建项目,并且我请求以下依赖项:

dependencies { 
compile 'org.apache.logging.log4j:log4j-core:2.2'
compile 'org.slf4j:slf4j-api:1.7.12'    
compile 'org.slf4j:slf4j-log4j12:1.7.12'
compile group: 'org.opensaml', name: 'opensaml', version: '2.6.4'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

我在网上搜索,发现有些人通过告诉 weblogic 使用他们的库来解决这个问题,但它对我不起作用。 我的部署文件 weblogic.xml 有这个:

    <?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" 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/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd">
    <prefer-application-packages>
        <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
</wls:weblogic-web-app>

Weblogic 控制台堆栈跟踪:

    java.lang.NoClassDefFoundError: Could not initialize class org.opensaml.xml.XMLConfigurator
    at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:220)
    at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:207)
    at org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:100)
    at com.saml.ServiceProvider.<init>(ServiceProvider.java:37)
    at com.saml.WebServices.auth(WebServices.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:92)
    at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:74)
    at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:151)
    at com.sun.xml.ws.server.sei.EndpointMethodHandlerImpl.invoke(EndpointMethodHandlerImpl.java:268)
    at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:866)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:815)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:778)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:680)
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:403)
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:532)
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:253)
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
    at weblogic.wsee.jaxws.WLSServletAdapter.handle(WLSServletAdapter.java:171)
    at weblogic.wsee.jaxws.HttpServletAdapter$AuthorizedInvoke.run(HttpServletAdapter.java:708)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
    at weblogic.wsee.util.ServerSecurityHelper.authenticatedInvoke(ServerSecurityHelper.java:103)
    at weblogic.wsee.jaxws.HttpServletAdapter$3.run(HttpServletAdapter.java:311)
    at weblogic.wsee.jaxws.HttpServletAdapter.post(HttpServletAdapter.java:336)
    at weblogic.wsee.jaxws.JAXWSServlet.doRequest(JAXWSServlet.java:95)
    at weblogic.servlet.http.AbstractAsyncServlet.service(AbstractAsyncServlet.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
java.lang.NoClassDefFoundError: Could not initialize class org.opensaml.xml.XMLConfigurator
    at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:220)
    at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:207)
    at org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:100)
    at com.saml.ServiceProvider.<init>(ServiceProvider.java:37)
    at com.saml.WebServices.auth(WebServices.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:92)
    at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:74)
    at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:151)
    at com.sun.xml.ws.server.sei.EndpointMethodHandlerImpl.invoke(EndpointMethodHandlerImpl.java:268)
    at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:866)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:815)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:778)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:680)
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:403)
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:532)
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:253)
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
    at weblogic.wsee.jaxws.WLSServletAdapter.handle(WLSServletAdapter.java:171)
    at weblogic.wsee.jaxws.HttpServletAdapter$AuthorizedInvoke.run(HttpServletAdapter.java:708)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
    at weblogic.wsee.util.ServerSecurityHelper.authenticatedInvoke(ServerSecurityHelper.java:103)
    at weblogic.wsee.jaxws.HttpServletAdapter$3.run(HttpServletAdapter.java:311)
    at weblogic.wsee.jaxws.HttpServletAdapter.post(HttpServletAdapter.java:336)
    at weblogic.wsee.jaxws.JAXWSServlet.doRequest(JAXWSServlet.java:95)
    at weblogic.servlet.http.AbstractAsyncServlet.service(AbstractAsyncServlet.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

我已经通过删除库设法克服了这个问题:

com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0

com.bea.core.bea.opensaml_1.0.0.0_6-1-0-0

是否可以禁用库而不是删除它们?

java xml weblogic noclassdeffounderror opensaml
1个回答
1
投票

是的,您可以更改类加载器的优先级,请查看此文档: https://docs.oracle.com/middleware/1213/wls/WLPRG/classloading.htm#WLPRG289

想法是跳过为您的应用程序使用 weblogic lib,看看这部分:

prefer-web-inf-classes Element

配置过滤类加载器配置 FilteringClassLoader 指定从中加载某个包 一个应用程序,添加一个 prefer-application-packages 描述符元素 到 weblogic-application.xml ,它详细说明了要安装的包列表 从应用程序加载。以下示例指定 org.apache.log4j.* 和 antlr.* 包从 应用程序,而不是系统类加载器:

<prefer-application-packages>
  <package-name>org.apache.log4j.*</package-name>
  <package-name>antlr.*</package-name>
</prefer-application-packages> 

prefer-application-packages 描述符元素也可以在 weblogic.xml 中定义。有关详细信息,请参阅“prefer-application-packages”。

您可以通过配置 FilteringClassLoader 来指定为包含在 EAR 文件中的 WAR 文件加载某个包 WAR 文件的 weblogic.xml 文件。

例如A.ear包含B.war。 A.ear在weblogic-application.xml中定义了FilteringClassLoader,B.war定义了一个 weblogic.xml 中的不同 FilteringClassLoader。当您部署 A.ear 时, B.war加载FilteringClassLoader中定义的包 weblogic.xml。 WAR 级别的 FilteringClassLoader 优先于 此 WAR 文件的 EAR 级 FilteringClassLoader。

有关配置过滤类加载器的帮助,请参阅使用类加载器分析工具 (CAT)。

© www.soinside.com 2019 - 2024. All rights reserved.