Получение ClassNotFound для класса Option PaxExam при запуске теста

При запуске модульных тестов с PaxExam я получаю следующее ClassNotFoundException:

java.lang.ClassNotFoundException: org.ops4j.pax.exam.Option
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2693)
at java.lang.Class.privateGetPublicMethods(Class.java:2894)
at java.lang.Class.privateGetPublicMethods(Class.java:2903)
at java.lang.Class.getMethods(Class.java:1607)
at org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.findAndInvoke(JUnitProbeInvoker.java:94)
at org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.call(JUnitProbeInvoker.java:73)
at org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:433)
at org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:406)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport$1.run(Transport.java:178)
at sun.rmi.transport.Transport$1.run(Transport.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Это происходит, даже если JAR PaxExam (и все зависимости) находятся на пути к классам Maven.

Я пытался найти решение этой проблемы в течение достаточно долгого времени; Я был бы очень признателен за любой совет, который может дать любой. Благодарю.

РЕДАКТИРОВАТЬ:

Ошибка возникает из-за того, что каждый тест реализует интерфейс BundleTest импортируется (динамически) из другого пакета, который обеспечивает значение по умолчанию @Configuration метод. Этот комплект (в настоящее время) явно не экспортирует и не импортирует классы экзаменов pax, так что это может быть частью проблемы?

Я обновлю вопрос снова, как только я проверил это, чтобы узнать.

2 ответа

Решение

Проблема действительно заключалась в том, что класс ссылался через импорт на другой класс, который импортировал классы Pax.

Для иллюстрации импорта:

класс A <- класс B <- Pax

Проблема заключалась в том, что класс B не импортировал классы Pax Exam в манифесте Bundle. Таким образом, пока Pax создавал динамический импорт для тестовых классов в классе A, класс B был из другого пакета. Это означало, что OSGi не разрешает импорт в классе B.

Я полагаю, что урок заключается в проверке объявленных зависимостей ваших других зависимых пакетов.

Надеюсь, это поможет кому-то еще, кто имеет эту проблему в будущем!

Ваш пакет должен импортировать пакет org.ops4j.pax.examНапример, что-то вроде этого в META-INF/MANIFEST.MF:

Import-Package: org.ops4j.pax.exam

Обновление: см. Эту вики-страницу для получения дополнительной информации.

Другие вопросы по тегам