Apache HttpClient in MATLAB 2012+

I want to use apache httpclient to interact with webservices. In particular, I use http://mirror.arcor-online.net/www.apache.org//httpcomponents/httpclient/binary/httpcomponents-client-4.3-bin.zip

So, in MATLAB, I load all the included banks in the javaclasspath, and then I can create a client instance to work with:

In MATLAB 2007b and 2011b (these are the versions I have):

client = org.apache.http.impl.client.HttpClients.createDefault() client = org.apache.http.impl.client.InternalHttpClient@1e89831 

In 2012b:

 >> client = org.apache.http.impl.client.HttpClients.createDefault() Java exception occurred: java.lang.NoSuchFieldError: INSTANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52) at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56) at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112) at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:710) at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58) >> client = org.apache.http.impl.client.HttpClients.createDefault() Java exception occurred: java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112) at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:710) at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58) 

This really bothers me, since the code in 2011b and 2012b is identical, all jars are loaded, and both Java versions coming with MATLAB are also identical (1.6.0_17-b04). So I really don’t understand why classes became inaccessible in 2012.

I tried playing with the matlab class loader, but this confuses me even more:

 >> jloader = com.mathworks.jmi.ClassLoaderManager.getClassLoaderManager(); >> jloader.loadClass('org.apache.http.impl.conn.ManagedHttpClientConnectionFactory') Java exception occurred: java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.mathworks.jmi.ClassLoaderManager.loadClass(ClassLoaderManager.java:440) >> jloader.getCurrentClassLoader.loadClass('org.apache.http.impl.conn.ManagedHttpClientConnectionFactory') ans = class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory 

I also tried putting all jar files in a static classpath, which also had no effect. I am glad about any ideas on how to solve this problem and how to find the actual cause of the problem ...

+6
source share
1 answer

You have inconsistent versions of httpclient and httpcore in your classpath. It looks like you only updated httpclient, but none of its dependencies. You can see the list of dependencies on the Apache HttpClient project page. http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/dependencies.html

You must also ensure that you do not have multiple versions of the dependencies in the classpath. It looks like MATLAB 2012b already has the httpcore version, so you are facing this conflict.

+4
source

Source: https://habr.com/ru/post/954054/


All Articles