Java: NoClassDefFoundError в переопределенном методе

1

хорошо, у меня есть вопрос об переопределении. Мне нужно переопределить один метод из библиотеки 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 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() теперь тот же, что и в родительском классе. Исходный код родительского класса находится здесь.

Если я прокомментирую этот метод, это нормально и работает. Но если я использую мой метод overriden, я получаю 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, и я понятия не имею, что с ним делать. Интересно, можете ли вы помочь мне с этим или хотя бы направить меня к методу определения причины этой проблемы.

Я только выяснил, что это исключение возникает, когда есть некоторый сбой в статических элементах, но у этого класса их нет.

Большое спасибо!

  • 1
    Если бы я был средой исполнения Java, я бы тоже пожаловался: D. Среда выполнения говорит, что не может найти внутренний внутренний класс. Вы пытались поднять самый внутренний класс на один уровень вверх? Или, может быть, проверить, что происходит, когда вы реализуете оба внутренних класса как свои собственные классы в своем собственном .java-файле.
  • 0
    Это не просто внутренние классы, это анонимные внутренние классы (оба) для загрузки.
Теги:
override
noclassdeffounderror

4 ответа

1
Лучший ответ

JVM жалуется, что не может найти org.teleal.cling.transport.impl.StreamClientImpl$1$1 - это анонимный экземпляр import sun.net.www.protocol.http.Handler - см. Здесь в строке 77,

Поэтому, вероятно, у вас нет этого пакета солнца, установленного на вашем компьютере. Но зачем вам это нужно, когда вы этого не делали раньше.

Однако, я думаю, что это может быть проблема, связанная с пакетом. Точки StackTrace в виде StreamClientImpl класса в org.teleal.cling.transport.impl пакете, в то время как исходный код, который вы ссылаетесь на ввозится StreamClientImpl класса из другой упаковки - org.teleal.cling.transport.impl.apache (примечание дополнительный пакет Apache в конце).

Вам нужно разобраться, какой StreamClientImpl вы действительно хотите (возможно, тот, который находится в пакете apache).

1

Я думаю, что проблема в том, что не найти класс StreamClientImpl, помните, что имя класса - это каталоги и подкаталоги, где это так, поэтому имя вашего класса, которое вы не можете найти, - org.teleal.cling.transport.impl. StreamClientImpl, я не знаю класс, я предполагаю его в библиотеку.

Помните, что если вы экспортируете proyect и имеете свой.class или.jar, каталоги ваших кланов должны быть такими же, как имя класса, поэтому вы должны иметь StreamClientImpl в папке, например org/teleal/cling/transport/impl/StreamClientImpl.

Надеюсь, это может помочь вам...

0

У меня была такая же проблема, как у вас, и я решил импортировать библиотеку "teleal-common-1.0.13.jar", и проблема была решена.

Я использую старую библиотеку cling-core-1.0.5.jar. Возможно, если вы используете новую версию библиотеки, возможно, вам понадобится также импортировать новую библиотеку, дополненную цифрами.

Кстати, я использую эту библиотеку в приложении для Android.

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

0

Используйте эти классы для импорта:

org.fourthline.cling.transport.impl.apache.StreamClientConfigurationImpl
org.fourthline.cling.transport.impl.apache.StreamClientImpl
org.fourthline.cling.transport.spi.StreamClient

я думаю, это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню