简体   繁体   中英

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

I am getting the following error while instantiating a web application on WebSphere Liberty beta. The application starts successfully on 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

Please provide any pointers that could help me resolve this. Here is server.xml for liberty server:

<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>

EDIT: The exception is thrown while generating spring jax-ws client bean. My application-context.xml file for the webservice client looks like:

<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>

SSL by default is not enabled on Liberty. Did you add ssl-1.0 feature to your server.xml and configured according to this page Enabling SSL communication for the Liberty profile .

PS. Add your server.xml file to the question.

If you are using JVM from full WebSphere, you need to change SSL factories. Create jvm.options file in the server directory with the following content:

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

Create myjava.security file in the server directory with the following content (empty properties):

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

Alternatively, test your application with Liberty running on Oracle JVM.

    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();
            }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM