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末尾的“ $”。
以前有没有人遇到过这个问题,并且知道是什么原因造成的?
答案 0 :(得分:0)
首先,我认为官方代码是完全正确的,而您的jdk版本和事件中心软件包版本没有错,因为我在您的环境中测试了示例代码,并且对我有用。
依赖性:
示例代码:
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();
}
}
}
输出:
其次,根据您的错误详细信息: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