Как исправить ошибку «java.lang.NoClassDefFoundError: com / microsoft / azure / eventhubs / EventHubClient $» в Java - PullRequest
1 голос
/ 14 октября 2019

Java версия: 1.8
Azure EventHubs Версия: 3.0.1

Я пытаюсь подключиться к своему EventHubClient, вызвав:

EventHubClient.createFromConnectionStringSync(connStr.toString(), executorService)

Однако этот вызов выдает ошибку NoClassDefFoundError следующего:

java.lang.NoClassDefFoundError: com/microsoft/azure/eventhubs/EventHubClient$

Обычно, когда я сталкиваюсь с NoClassDefFoundError, это происходит потому, чтоЯ не импортировал соответствующий пакет. Однако в этом случае у меня импортирован пакет Azure EventHub. Больше всего меня смущает то, что в конце EventHubClient стоит '$'.

Кто-нибудь сталкивался с этой проблемой раньше и знает, что может быть ее причиной?

1 Ответ

0 голосов
/ 21 октября 2019

Во-первых, я полагаю, что официальный код абсолютно верен и ничего плохого в вашей версии jdk и версии пакета концентратора событий, потому что я протестировал пример кода в вашей среде, и он работает для меня.

зависимости:

enter image description here

Код образца:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.microsoft.azure.eventhubs.ConnectionStringBuilder;
import com.microsoft.azure.eventhubs.EventData;
import com.microsoft.azure.eventhubs.EventHubClient;
import com.microsoft.azure.eventhubs.EventHubException;

import java.io.IOException;
import java.nio.charset.Charset;
import java.time.Instant;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

public class SimpleSend {
    public static void main(String[] args)
            throws EventHubException, ExecutionException, InterruptedException, IOException {
        final ConnectionStringBuilder connStr = new ConnectionStringBuilder()
                .setNamespaceName("jaygongeventhub")
                .setEventHubName("jaygong")
                .setSasKeyName("RootManageSharedAccessKey")
                .setSasKey("4RXaJ2NPwz635HYlOpKGMCh89N/9i1kz3PSAC9WeYq0=");

        final Gson gson = new GsonBuilder().create();
        final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);
        final EventHubClient ehClient = EventHubClient.createFromConnectionStringSync(connStr.toString(), executorService);

        try {
            for (int i = 0; i < 10; i++) {

                String payload = "Message " + Integer.toString(i);
                byte[] payloadBytes = gson.toJson(payload).getBytes(Charset.defaultCharset());
                EventData sendEvent = EventData.create(payloadBytes);
                ehClient.sendSync(sendEvent);
            }
            System.out.println(Instant.now() + ": Send Complete...");
            System.out.println("Press Enter to stop.");
            System.in.read();
        } finally {
            ehClient.closeSync();
            executorService.shutdown();
        }
    }
}

Выход:

enter image description here


Во-вторых, на основе вашей детализации ошибки: NoClassDefFoundError, которая отличается от ClassNotFoundException. ClassNotFoundException приходит, когда JVM пытается загрузить класс во время выполнения, динамически означает, что вы даете имя классу во время выполнения, а затем JVM пытается загрузить его, и если этот класс не найден в пути к классам, он выдает java.lang.ClassNotFoundException. Хотя в случае NoClassDefFoundError проблемный класс присутствовал во время компиляции, и поэтому программа успешно скомпилирована, но не доступна во время выполнения по любой причине.

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

1) Класс недоступен в Java Classpath.

2) Возможно, вы запускаете программу с помощью команды jar, а класс не определен в атрибуте ClassPath файла манифеста.

3) Любой сценарий запуска переопределяет переменную среды Classpath. 4) Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если одна из его зависимостей, например, нативная библиотека, может быть недоступна.

4) Проверьте наличие java.lang.ExceptionInInitializerError в файле журнала. NoClassDefFoundError из-за сбоя статической инициализации является довольно распространенным явлением.

5) Если вы работаете в среде J2EE, то видимость Class среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError, см. Примеры и раздел сценариев дляподробное обсуждение.

Подробнее: https://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html#ixzz62y4liZ3G Подробнее: https://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html#ixzz62y4NPiEB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...