NoClassDefFoundError после загрузки jar-файлов в Hazelcast Cloud через развертывание кода клиента - PullRequest
0 голосов
/ 21 января 2020

В настоящее время я пробую Hazelcast Cloud, и мне нужно загрузить JAR-зависимости на серверы Hazelcast Cloud. У меня есть около 20 МБ для загрузки, загрузка кажется хорошей с помощью функции развертывания кода пользователя клиента, однако, как только загрузка завершится и я попытаюсь использовать классы, я получаю эту ошибку. Я использую и потоки Jet, и карты IMDG, наборы, списки и службу исполнителя. Некоторые функции, которые не поддерживаются в Hazelcast Cloud, или я что-то упустил? Я подумал, может быть, мне также нужно addClass, а не addJar при программном использовании функции развертывания кода клиента.

Вот код для добавления зависимости.

ClientUserCodeDeploymentConfig clientUserCodeDeploymentConfig = 
    new ClientUserCodeDeploymentConfig();

clientUserCodeDeploymentConfig.addJar("path to jar containing com.my.jarlibrary.SomeClass");

clientUserCodeDeploymentConfig.setEnabled(true);

ClientConfig config = new ClientConfig(); // Jet & Hazelcast config
config.setUserCodeDeploymentConfig(clientUserCodeDeploymentConfig);

// I also tried added the class after adding the jar which contains it, 
// and same error comes up.
clientUserCodeDeploymentConfig.addClass(SomeClass.class);

Вот ошибка, которую я получаю:

java.util.concurrent.ExecutionException: com.hazelcast.client.UndefinedErrorCodeException: 
Class name: java.lang.NoClassDefFoundError, Message:  com/my/jarlibrary/SomeClass
    at com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveAndThrowIfException(ClientInvocationFuture.java:109)
    at com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveAndThrowIfException(ClientInvocationFuture.java:33)
    at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:163)
    at com.hazelcast.client.spi.impl.ClientUserCodeDeploymentService.deploy(ClientUserCodeDeploymentService.java:172)
    at com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl.onClusterConnect(HazelcastClientInstanceImpl.java:444)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl.connectAsOwner(ClusterConnectorServiceImpl.java:150)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl.connectToCandidate(ClusterConnectorServiceImpl.java:252)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl.connectToClusterInternal(ClusterConnectorServiceImpl.java:192)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl.access$000(ClusterConnectorServiceImpl.java:62)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl$1.call(ClusterConnectorServiceImpl.java:279)
    at com.hazelcast.client.connection.nio.ClusterConnectorServiceImpl$1.call(ClusterConnectorServiceImpl.java:275)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
Caused by: com.hazelcast.client.UndefinedErrorCodeException: Class name: java.lang.NoClassDefFoundError, Message: com/my/jarlibrary/SomeClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at com.hazelcast.internal.usercodedeployment.impl.ClassSource.define(ClassSource.java:50)
    at com.hazelcast.internal.usercodedeployment.impl.ClassLocator.defineClassFromClient(ClassLocator.java:126)
    at com.hazelcast.internal.usercodedeployment.UserCodeDeploymentService.defineClass(UserCodeDeploymentService.java:72)
    at com.hazelcast.internal.usercodedeployment.impl.operation.DeployClassesOperation.run(DeployClassesOperation.java:50)
    at com.hazelcast.spi.Operation.call(Operation.java:170)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:210)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:199)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.run(OperationExecutorImpl.java:407)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.runOrExecute(OperationExecutorImpl.java:434)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvokeLocal(Invocation.java:648)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvoke(Invocation.java:633)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke0(Invocation.java:592)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke(Invocation.java:256)
    at com.hazelcast.spi.impl.operationservice.impl.InvocationBuilderImpl.invoke(InvocationBuilderImpl.java:61)
    at com.hazelcast.client.impl.protocol.task.AbstractMultiTargetMessageTask.processMessage(AbstractMultiTargetMessageTask.java:57)
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:129)
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:109)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
    at ------ submitted from ------.(Unknown Source)
    at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolve(InvocationFuture.java:126)
    at com.hazelcast.spi.impl.AbstractInvocationFuture$1.run(AbstractInvocationFuture.java:251)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
    at ------ submitted from ------.(Unknown Source)
    at com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveAndThrowIfException(ClientInvocationFuture.java:96)
    ... 16 more)

1 Ответ

1 голос
/ 21 января 2020

Если вы загрузите SomeClass из другого загрузчика классов, клиент Hazelcast не сможет загрузить определение своего класса, поэтому выдает это исключение. Пример сценария может выглядеть следующим образом: у вас есть загрузочное приложение Spring, запущенное на Tomcat. SomeClass загружается загрузчиком классов Tomcat, а клиентские классы Hazelcast загружаются через загрузчик классов с весенней загрузкой. В этом случае клиент Hazelcast имеет доступ к SomeClass, но не к определению своего класса, которое загружается через загрузчик классов.

В качестве обходного пути вы должны указать клиенту Hazelcast, какой загрузчик классов использовать:

clientConfig.setClassLoader(SomeClass.class.getClassLoader());
...