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.

То есть надеюсь быть полезным.

Другие вопросы по тегам