Java: NoClassDefFoundError в переопределенном методе
Ну у меня есть вопрос о переопределении. Мне нужно переопределить один метод из библиотеки Cling UPnP. Поэтому я расширил класс обслуживания и написал следующий код:
public class UpnpBrowseService extends AndroidUpnpServiceImpl
{
@Override
protected AndroidUpnpServiceConfiguration createConfiguration(WifiManager wifiManager)
{
return new AndroidUpnpServiceConfiguration(wifiManager)
{
@Override
public StreamClient createStreamClient()
{
return new StreamClientImpl(new StreamClientConfigurationImpl() {
public int getConnectionTimeoutSeconds() {
return 2;
}
public int getDataReadTimeoutSeconds() {
return 3;
}
public boolean getStaleCheckingEnabled() {
// comment from AndroidHttpClient.java:
//
// Turn off stale checking. Our connections break all the time anyway,
// and it's not worth it to pay the penalty of checking every time.
return false;
}
public int getRequestRetryCount() {
// since "connections break all the time anyway", limit number of retries to
// minimize time spent in HttpClient.execute()
return 1;
}
});
}
};
}
}
Для целей тестирования метод createStreamClient() теперь такой же, как в родительском классе. Исходный код родительского класса находится здесь.
Если я прокомментирую этот метод, он в порядке и работает. Но если я использую мой переопределенный метод, я получаю NoClassDefFoundError:
12-14 09:52:12.110: E/AndroidRuntime(20784): FATAL EXCEPTION: Thread 18 (Active: 6)
12-14 09:52:12.110: E/AndroidRuntime(20784): java.lang.NoClassDefFoundError: org.teleal.cling.transport.impl.StreamClientImpl$1$1
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.transport.impl.StreamClientImpl$1.createURLStreamHandler(StreamClientImpl.java:77)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.setupStreamHandler(URL.java:551)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.<init>(URL.java:286)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.<init>(URL.java:157)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.header.LocationHeader.setString(LocationHeader.java:45)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.header.UpnpHeader.newInstance(UpnpHeader.java:171)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.parseHeaders(UpnpHeaders.java:68)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.getAsArray(UpnpHeaders.java:136)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.getFirstHeader(UpnpHeaders.java:143)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.discovery.IncomingSearchResponse.isSearchResponseMessage(IncomingSearchResponse.java:46)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.protocol.async.ReceivingSearchResponse.execute(ReceivingSearchResponse.java:54)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.protocol.ReceivingAsync.run(ReceivingAsync.java:64)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.lang.Thread.run(Thread.java:1019)
Я немного новичок в решении такого рода NoClassDefFoundError, и я понятия не имею, что с ним делать. Интересно, не могли бы вы помочь мне с этим или хотя бы указать мне какой-нибудь метод, как определить причину этой проблемы.
Я только узнал, что это исключение происходит, когда есть некоторый сбой в статических элементах, но у этого класса их нет.
Большое спасибо!
4 ответа
JVM жалуется, что не может найти org.teleal.cling.transport.impl.StreamClientImpl$1$1
класс - это анонимный экземпляр import sun.net.www.protocol.http.Handler
- см. здесь на линии 77.
Так что, вероятно, у вас не установлен этот пакет Sun на вашем компьютере. Но зачем тебе это нужно, если раньше этого не было.
Тем не менее, я думаю, что это может быть проблемой, связанной с пакетом. Трассировка стека указывает на StreamClientImpl
класс в org.teleal.cling.transport.impl
пакет, тогда как исходный код, на который вы ссылаетесь, импортирует его StreamClientImpl
класс из другой упаковки - org.teleal.cling.transport.impl.apache
(обратите внимание на дополнительный пакет apache в конце).
Вам нужно разобраться, какие StreamClientImpl
Вы действительно хотите (вероятно, тот, который в пакете apache).
Я думаю, что проблема в том, что не удается найти класс StreamClientImpl, помните, что имя класса - это каталоги и подкаталоги, в которых он находится, поэтому имя вашего класса, которое вы не можете найти, - org.teleal.cling.transport.impl. StreamClientImpl, я не знаю, класс, я полагаю, в библиотеку.
Помните, что если вы экспортируете проект и у вас есть.class или.jar, каталоги ваших выражений должны совпадать с именем класса, поэтому вы должны иметь StreamClientImpl в папке, подобной org / teleal / cling / transport / impl / StreamClientImpl.
Я надеюсь, что это может помочь вам...
Используйте эти классы для импорта:
org.fourthline.cling.transport.impl.apache.StreamClientConfigurationImpl
org.fourthline.cling.transport.impl.apache.StreamClientImpl
org.fourthline.cling.transport.spi.StreamClient
я думаю это поможет
У меня была та же проблема, что и у вас, и я решил ее, импортировав библиотеку "teleal-common-1.0.13.jar", и проблема была решена.
Я использую старую библиотеку cling-core-1.0.5.jar. Возможно, если вы используете новую версию библиотеки, возможно, вам также потребуется импортировать новую общую библиотеку teleal.
Кстати, я использую эту библиотеку в приложении для Android.
То есть надеюсь быть полезным.