ClassNotFound исключение в режиме разработки quarkus при чтении сообщения от RabbitMQ с помощью camel

#apache-camel #quarkus

Вопрос:

Я использую apache-camel-quarkus для чтения из очереди RabbitMQ, и в производстве все работает нормально. Но когда я запускаю его в режиме разработки и пытаюсь выполнить вариант использования, в котором используется RabbitMQ, я получаю исключение при десериализации сообщения из очереди

 java.lang.ClassNotFoundException: messaging.model.ReportAvailableMessage
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:429)
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:405)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at java.base/java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:756)
    at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1995)
    at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1862)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2169)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
    at org.apache.camel.component.rabbitmq.RabbitMQMessageConverter.deserializeBody(RabbitMQMessageConverter.java:354)
    at org.apache.camel.component.rabbitmq.RabbitMQMessageConverter.populateMessageBody(RabbitMQMessageConverter.java:344)
    at org.apache.camel.component.rabbitmq.RabbitMQMessageConverter.populateRabbitExchange(RabbitMQMessageConverter.java:289)
 

Это как-то связано с путем к классам в режиме разработки.
То же самое произошло с интеграционными тестами, и мне пришлось использовать это свойство, чтобы исправить это

 quarkus.test.flat-class-path=true
 

Я провел некоторый поиск и попытался использовать quarkus.class-loading.parent-first-artifacts идентификатор артефакта в своем приложении, но он также не работал.

Кто-нибудь знает, как я могу это исправить? Спасибо

Ru: Версия для кварка: 2.4.0.Окончательная, Camel: 2.2.0

Комментарии:

1. В документации Quarkus говорится, что «Изменяет тесты для использования «плоского» пути к классу, используемого в версиях Quarkus 1.x. Это означает, что все классы Quarkus и test загружаются в один и тот же загрузчик классов, однако это означает, что вы не можете использовать непрерывное тестирование. Обратите внимание, что если вы сочтете это необходимым для вашего приложения, то у вас также могут возникнуть проблемы при работе в режиме разработки, в котором не может использоваться плоский путь к классу.» Таким образом, может оказаться, что вы вообще не сможете использовать режим разработки, если вам требуется, чтобы этот параметр был истинным.

2. @StefanR использование этого флага в тестах-это обходной путь для развертывания приложения в рабочей среде после запуска интеграционных тестов. Но в этом не должно быть необходимости, так как это прекрасно работает в производстве. Вот почему я опубликовал этот вопрос, так как кажется, что что-то несовместимо с режимом разработки или тестами при использовании RabbitMQ consumer от camel-quarkus