【问题标题】:java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy, though it is present in classpathjava.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy,虽然它存在于类路径中
【发布时间】:2018-05-21 06:18:40
【问题描述】:

我在 tomcat 服务器上运行一个应用程序。调用特定函数时出现以下错误:

java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy

我的班级是:

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
/*import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;*/
//import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.log4j.Logger;
import org.performics.air.business.common.data.HttpParam;

public class SendAndReceiveUtil implements Serializable {
//FIXME: move to suitable package
    /**
     * 
     */
    private static final long serialVersionUID = 2649891233958197253L;
    private static Logger LOG = Logger.getLogger(SendAndReceiveUtil.class);


    public static String httpPostWithTLS(String request,String url,Map<String,String> headerParameterMap){
        String responseStr = null;
        try{
            // FIXME: need to handle supplier timeout and gzip

            String contentType="";
            String soapAction="";               
            boolean zipForRequest=false;
            boolean acceptEncoding = false; 
            boolean zipForResponse=false;
            if (headerParameterMap!=null){
                contentType=headerParameterMap.get(HttpParam.CONTENTTYPE.toString())!=null?headerParameterMap.get(HttpParam.CONTENTTYPE.toString()):"";
                zipForRequest=(headerParameterMap.containsKey(HttpParam.ZIPFORREQUEST.toString()))? new Boolean(headerParameterMap.get(HttpParam.ZIPFORREQUEST.toString())):false;
                acceptEncoding=(headerParameterMap.containsKey(HttpParam.ACCEPT_ENCODING.toString()))? new Boolean(headerParameterMap.get(HttpParam.ACCEPT_ENCODING.toString())):false;
                zipForResponse=(headerParameterMap.containsKey(HttpParam.ZIPFORRESPONSE.toString()))? new Boolean(headerParameterMap.get(HttpParam.ZIPFORRESPONSE.toString())):false;
                soapAction=headerParameterMap.get(HttpParam.SOAPACTION.toString())!=null?headerParameterMap.get(HttpParam.SOAPACTION.toString()):"";
            }

            SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null,new TrustSelfSignedStrategy()).build();
            // Allow TLSv1.2 protocol only, use NoopHostnameVerifier to trust self-singed cert
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1.2" }, null, new NoopHostnameVerifier());
            //do not set connection manager
            HttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("SOAPAction", soapAction);

            StringEntity mEntity = new StringEntity(request, "UTF-8");

            if(StringUtils.isNotBlank(contentType)){
                mEntity.setContentType(contentType);
                mEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,contentType));
            }else{
                mEntity.setContentType("text/xml;charset=UTF-8");
                mEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING,"gzip"));
            }
            httpPost.addHeader("Content-Encoding", "gzip" );
            httpPost.addHeader("Accept-Encoding", "gzip,deflate" );
            if(null!=headerParameterMap.get("Cookie")){
                httpPost.addHeader("Cookie", headerParameterMap.get("Cookie"));
            }
            httpPost.setEntity(mEntity);
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity et=response.getEntity();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            et.writeTo(os);

            responseStr = new String(os.toByteArray());
            }catch(Exception e){
                LOG.error(e.getMessage(), e);
            }
        return responseStr;
    } 
}

调用httpPostWithTLS() 函数时出错。我在网上搜索了一下,发现该类在编译时可用,但在运行时不可用,但我无法更正它。 我正在使用以下 http jar:

  • commons-httpclient-3.1.jar
  • httpclient-4.5.3.jar
  • httpcore-4.4.6.jar
  • httpclient-cache-4.5.3.jar
  • httpclient-win-4.5.3.jar
  • httpmime-4.5.3.jar

【问题讨论】:

  • 您是否使用 WAR 存档部署到 Tomcat?你能显示你的 POM 描述符吗?

标签: java apache maven ssl jar


【解决方案1】:

尝试将httpcore-4.4.6.jar和httpclient-cache-4.5.3.jar添加到服务器库并检查。

添加这些jar文件后我确实遇到了类似的问题,我的问题已经解决了。

谢谢,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2014-10-06
    • 2017-03-16
    • 2015-10-27
    相关资源
    最近更新 更多