如何修复Java中的“ java.lang.NoClassDefFoundError:com / microsoft / azure / eventhubs / EventHubClient $”错误

时间:2019-10-14 18:18:55

标签: azure-eventhub

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 :(得分:0)

首先,我认为官方代码是完全正确的,而您的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尝试加载它,并且如果在类路径中未找到该类,则会抛出{{1} }。对于java.lang.ClassNotFoundException来说,有问题的类是在编译时出现的,这就是为什么程序成功编译但由于任何原因在运行时不可用的原因。

我建议您检查以下解决方案或要点以尝试解决问题:

1)该类在Java类路径中不可用。

2)您可能正在使用jar命令运行程序,并且清单文件的ClassPath属性中未定义类。

3)任何启动脚本都将覆盖Classpath环境变量。 4)因为NoClassDefFoundError是java.lang.LinkageError的子类,所以如果其中一个依赖项(如本机库)可能不可用,它也会出现。

4)检查日志文件中是否存在java.lang.ExceptionInInitializerError。由于静态初始化失败而导致的NoClassDefFoundError很常见。

5)如果您在J2EE环境中工作,则多个Classloader之间Class的可见性也可能导致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