web-dev-qa-db-ja.com

org.Apache.http.ssl.TrustStrategyのClassNotFoundException

HTTP/HTTPS POSTリクエストを作成するプラグインを実行しようとしています。その上で、必要な依存関係、httpclientおよびhttpcoreが宣言されています。それぞれバージョン4.5.3と4.4.6を使用していますが、すべて正しくインポートされていますが(つまり)、実行時に次のエラーが発生しました。

Caused by: Java.lang.NoClassDefFoundError: 
org/Apache/http/ssl/TrustStrategy
25.06 19:59:12 [Server] INFO at 
com.b5team.postrequest.Main.onCommand(Main.Java:77) ~[?:?]
25.06 19:59:12 [Server] INFO at 
org.bukkit.command.PluginCommand.execute(PluginCommand.Java:44) ~
[Spigot.jar:git-Spigot-3fb9445-6e3cec8]
25.06 19:59:12 [Server] INFO ... 10 more
25.06 19:59:12 [Server] INFO Caused by: 
Java.lang.ClassNotFoundException: org.Apache.http.ssl.TrustStrategy

そして、これが私のコードです:

package com.b5team.postrequest;

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.security.KeyManagementException;
import Java.security.KeyStoreException;
import Java.security.NoSuchAlgorithmException;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
import Java.util.ArrayList;
import Java.util.List;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;

import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.NameValuePair;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.entity.UrlEncodedFormEntity;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.config.Registry;
import org.Apache.http.config.RegistryBuilder;
import org.Apache.http.conn.socket.ConnectionSocketFactory;
import org.Apache.http.conn.socket.PlainConnectionSocketFactory;
import org.Apache.http.conn.ssl.NoopHostnameVerifier;
import org.Apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.Apache.http.ssl.SSLContextBuilder;
import org.Apache.http.conn.ssl.TrustStrategy;
import org.Apache.http.impl.client.HttpClientBuilder;
import org.Apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.Apache.http.message.BasicNameValuePair;

public class SocketPOSTRequest {

    public void sendRequest(String myurl, String hash, String args[]) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ClientProtocolException, IOException {

        HttpClientBuilder b = HttpClientBuilder.create();

        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

            public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                return true;
            }
        }).build();

        b.setSSLContext(sslContext);

        HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslSocketFactory)
                .build();

        PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        b.setConnectionManager(connMgr);

        HttpClient client = b.build();
        HttpPost post = new HttpPost(myurl);

        List<NameValuePair> params = new ArrayList<NameValuePair>(args.length);
        params.add(new BasicNameValuePair("hash", hash));

        for(int i = 0; i < args.length; i++) {
            params.add(new BasicNameValuePair("arg"+i, args[i]));
        }

        post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();

        if (entity != null) {

            InputStream in = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;

            System.out.println("[POSTRequest] Data sent successfully!");

            while ((line = reader.readLine()) != null) {
                System.out.println("[POSTRequest] Report: "+line);
            }
        }
    }
}

編集:ビルドにAntを使用していて、依存関係が正しく追加されています。依存関係を追加して、Mavenでもテストしましたが、エラーが残っています。

EDIT2: Mavenに切り替え、maven-shade-pluginおよびmaven-compile-pluginを追加。エラーはなくなりましたが、これを取得しましたJava.lang.NoSuchMethodError: org.Apache.http.impl.client.HttpClientBuilder.setSSLContext。 junitで実行する場合、エラーは発生しません。サーバー、つまりSpigot 1.11.2 Minecraftサーバーで実行している場合にのみ発生します。

5
bbruno5

mavenプロジェクトを使用している場合は、pom.xmlファイルに以下の依存関係を追加します。

 <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.3</version>
</dependency>
6
Ali Akbarpour

そこで、Apache httpclientとhttpcoreのsslcontextメソッドをjavax sslcontextメソッドに置き換えました。今、すべてがうまくいきます。上記のコードは純粋なJavaで正常に動作していたことを思い出してください。本当の問題は、Minecraftサーバーで実行しているときでした。

とにかく、私はドキュメントのために新しいコードの下に置きます、おそらく誰かを助けます。

package com.b5team.postrequest;

import Java.io.BufferedReader;
import Java.io.DataInputStream;
import Java.io.DataOutputStream;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.io.UnsupportedEncodingException;
import Java.net.MalformedURLException;
import Java.net.URL;
import Java.security.KeyManagementException;
import Java.security.NoSuchAlgorithmException;
import Java.security.SecureRandom;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
import Java.util.ArrayList;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpsPOSTRequest {

    public static void sendRequest(String myurl, String hash, String args[]) throws NoSuchAlgorithmException, KeyManagementException {

        try {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
            SSLContext.setDefault(context);

            URL url = new URL(myurl);
            HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
            con.setHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            });

            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)");
            con.setDoOutput(true);
            con.setDoInput(true);

            ArrayList<String> params = new ArrayList<String>(args.length + 1);

            DataOutputStream output = new DataOutputStream(con.getOutputStream());
            output.writeBytes("hash=" + hash);
            for(int i = 0; i < params.size(); i++) {
                output.writeBytes("&");
                output.writeBytes("arg" + i + "=" + args[i]);
                output.flush();
            }

            output.flush();
            output.close();

            DataInputStream input = new DataInputStream(con.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String line;

            System.out.println("[POSTRequest] Data sent successfully!");
            System.out.println("[POSTRequest] Resp Code:"+con.getResponseCode());
            System.out.println("[POSTRequest] Resp Message:"+con.getResponseMessage());

            while ((line = reader.readLine()) != null) {
                System.out.println("[POSTRequest] Report: "+line);
            }

            input.close();

        } catch (UnsupportedEncodingException e) {
            System.out.println("[POSTRequest] Encoding error. Maybe string have invalid caracters.");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("[POSTRequest] Invalid URL. Verify your URL and try again.");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("[POSTRequest] Error on HTTPS connection.");
            e.printStackTrace();
        }
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}
1
bbruno5