Websphere Liberty- java.lang.NoClassDefFoundError:com.ibm.websphere.ssl.SSLException

时间:2015-02-27 05:45:09

标签: java spring ssl websphere-8 websphere-liberty

在WebSphere Liberty beta上实例化Web应用程序时出现以下错误。应用程序在WebSphere Application Server 8.5.5上成功启动

Caused by: java.lang.NoClassDefFoundError: com.ibm.websphere.ssl.SSLException
    at java.lang.J9VMInternals.verifyImpl(Native Method)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:93)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:91)
    at java.lang.J9VMInternals.prepare(J9VMInternals.java:490)
    at java.lang.Class.getDeclaredConstructors(Class.java:553)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:231)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1002)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:975)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:633)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2381)
    ... 1 more

请提供任何可以帮我解决此问题的指示。这是自由服务器的server.xml:

<server description="new server">

    <!-- Enable features -->


    <!-- To access this server from a remote client add a host attribute to 
        the following element, e.g. host="*" -->

    <featureManager>
        <feature>beanValidation-1.1</feature>
        <feature>jdbc-4.0</feature>
        <feature>jaxb-2.2</feature>
        <feature>localConnector-1.0</feature>
        <feature>jaxws-2.2</feature>       
        <feature>distributedMap-1.0</feature>   

        <feature>servlet-3.0</feature>
        <feature>ssl-1.0</feature>
    </featureManager>
     <include location="GeneratedSSLInclude.xml"/>

    <httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint"/>

    <logging consoleLogLevel="INFO" traceSpecification="javax.validation *=info:javax.validation.*=finest"/>
    <library id="JAX-RS2">
        <fileset dir="C:\workspace_eclipse\JAX-RS2\lib" includes="*.jar" scanInterval="5"/>

    </library>

    <applicationMonitor updateTrigger="mbean"/>

    <enterpriseApplication id="ProductServiceEAR" location="ProductServiceEAR-1.0.ear" name="ProductServiceEAR">
     <classloader privateLibraryRef="JAX-RS2"/>
    </enterpriseApplication>


     <keyStore id="defaultKeyStore" password="{xor}AXnKzg6TSmwMw=="/> -->
</server>

编辑:生成spring jax-ws客户端bean时抛出异常。我的webservice客户端的application-context.xml文件如下所示:

<bean id="searchWebServiceClient"
        class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
        <property name="serviceInterface"
            value="au.com.test.search.SearchWebServiceClient" />
        <property name="wsdlDocumentUrl" value="classpath:/ServiceSchemas/involvedPartyManagement/involvedPartyManagement/SearchWebService_v2.wsdl" />
        <property name="namespaceUri"
            value="http://www.test.com.au/gn/involvedPartyManagement/services/SearchWebService/v2/WS0234" />
        <property name="serviceName"
            value="SearchWebService" />
        <property name="endpointAddress" value="${WS0234v2}" />     
    </bean>

2 个答案:

答案 0 :(得分:0)

Liberty上未启用SSL。您是否已将ssl-1.0功能添加到server.xml并根据此页面Enabling SSL communication for the Liberty profile进行了配置。

PS。将您的server.xml文件添加到问题中。

如果您使用完整WebSphere的JVM,则需要更改SSL工厂。 使用以下内容在服务器目录中创建jvm.options文件:

-Djava.security.properties=./myjava.security

使用以下内容(空属性)在服务器目录中创建myjava.security文件:

 ssl.SocketFactory.provider=
 ssl.ServerSocketFactory.provider=

或者,使用在Oracle JVM上运行的Liberty来测试您的应用程序。

答案 1 :(得分:0)

    You need to add transportSecurity feature type in server.xml as:

    <feature>transportSecurity-1.0</feature>

    and also add SSL configuration (see below a prescription from server.xml) so that it could create SSLContext using SPI in your code -- something like:
    JSSEHelper.getInstance().getSSLContext("sslContextName", null, null);

    <!-- SSL config -->
    <keyStore id="sslKeyStore" location="${ssl.keystore.location}" password="${ssl.password}"/>
    <keyStore id="sslTrustStore" location="${ssl.truststore.location}" password="${ssl.password}"/>

    <ssl id="sslContextName" sslProtocol="TLSv1" securityLevel="HIGH" keyStoreRef="sslKeyStore" trustStoreRef="sslTrustStore" clientAuthenticationSupported="true" >
         <outboundConnection host="${some.service.host}" port="${some.service.port}" />
    </ssl>

    Remember - you need to run your app under Liberty profile. If not then you put it inside try()/catch() block -- something like:

    try {
         return JSSEHelper.getInstance().getSSLContext("sslContextName", null, null);
        } 
        catch (SSLException | NoClassDefFoundError e) {
         return SSLContextBuilder
        .create()
        .loadTrustMaterial(
Paths.get(webServiceClientConfig.getTrustStore()).toFile(), webServiceClientConfig.getSslPassword().toCharArray())
                        .build();
            }