2013-09-18 3 views
6

Я хочу использовать apache httpclient для взаимодействия с webservices. В частности, я использую http://mirror.arcor-online.net/www.apache.org//httpcomponents/httpclient/binary/httpcomponents-client-4.3-bin.zipApache HttpClient в MATLAB 2012+

Так в MATLAB я загружаю все включенные банки в в javaclasspath, а затем я могу создать для клиента, например для работы с:

В MATLAB 2007b и 2011b (те, являются версии у меня есть):

client = org.apache.http.impl.client.HttpClients.createDefault() 
client = 

[email protected] 

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

Это реа lly bugging me, так как код в 2011b и 2012b идентичен, все jar загружены, и оба Java-версии, идущие с MATLAB, также идентичны (1.6.0_17-b04). Так что я действительно не понимаю, почему классы стали разгружаемыми в 2012 году.

Я пытался играть вокруг с MatLab загрузчиком классов - но это меня смущает еще больше:

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

Я также попытался поставить все JAR-файлы на статическую - путь к классам, которые не имеют никакого влияния ни. Радует любые идеи о том, как решить эту проблему и как найти фактическую причину проблемы ...

+0

Я не проверял, но, возможно, MATLAB уже поставляется с (возможно, более старой) версией этой библиотеки для собственного использования? – Amro

+0

Это может помочь в диагностике проблемы: http://stackoverflow.com/a/4380622/97160. Если это действительно проблема конфликтующих версий, есть обходные пути для переопределения банок MATLAB: http://stackoverflow.com/q/16366059/97160 – Amro

+0

Hm, но затем 'методыview org.apache.http.impl.conn.ManagedHttpClientConnectionFactory' должен показывать что-то еще до того, как я добавлю jar-файлы Apache в javaclasspath, не так ли? Это не так, это ошибка с 'No class found ...' – sebastian

ответ

4

У вас есть несоответствующие версии httpclient и httpcore на вашем пути к классам. Похоже, что вы обновили только httpclient, но ни одна из его зависимостей. Вы можете увидеть список зависимостей на странице проекта Apache HttpClient. http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/dependencies.html

Вы также должны убедиться, что у вас нет нескольких вариантов зависимостей от пути к классам. Похоже, что MATLAB 2012b уже имеет версию httpcore, поэтому вы сталкиваетесь с этим конфликтом.

+0

Это легко происходит, когда вы устанавливаете что-то с maven, и вы не замечаете, что maven устанавливает банки, которые у вас уже есть но разные версии. Я сделал это сегодня :-) – Christine

Смежные вопросы