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

При запуске модульных тестов с 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, так что это может быть частью проблемы?

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


person bgroenks    schedule 15.06.2015    source источник
comment
некоторые дополнительные сведения о вашей тестовой настройке могут быть полезны здесь   -  person Achim Nierbeck    schedule 16.06.2015
comment
см. OP для обновления; тестовая установка включает реализацию метода @Configuration по умолчанию, предоставленную через метод интерфейса по умолчанию. Это единственное, что мне кажется достойным внимания.   -  person bgroenks    schedule 17.06.2015


Ответы (2)


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

Чтобы проиллюстрировать импорт:

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

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

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

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

person bgroenks    schedule 21.06.2015

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

Import-Package: org.ops4j.pax.exam

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

person Neil Bartlett    schedule 16.06.2015
comment
Но весь смысл Pax в том, что он должен создавать пакет из ваших тестов на лету и динамически импортировать материал. Зачем мне нужно импортировать этот пакет? - person bgroenks; 16.06.2015
comment
Я думаю, что это просто странная проблема с classpath. Как только что-то попадает в среду OSGi, с этими вещами начинается ад :( - person bgroenks; 17.06.2015
comment
Err нет такой вещи, как путь к классам. - person Neil Bartlett; 17.06.2015
comment
Вы имеете в виду OSGi? Технически это так... это просто замаскировано системой импорта/экспорта пакетов. - person bgroenks; 17.06.2015
comment
Путь к классам есть только в пакетах. Импорт и экспорт пакетов не маскируют глобальный путь к классам, они заменяют его. Так что это не полезная концепция. - person Neil Bartlett; 17.06.2015
comment
Возможно. Но реализации OSGi используют внутренние загрузчики классов... даже если модель, которой они следуют, сильно отличается. Но в том-то и дело. Может быть очень трудно понять, как они открывают классы. - person bgroenks; 17.06.2015
comment
Как тяжело?? Просто посмотрите на импорт. Традиционная Java с ее плоским путем к классам сложнее... В любом случае, это обсуждение нас никуда не приведет. - person Neil Bartlett; 18.06.2015
comment
Я объяснил, в чем, по моему мнению, проблема, в моем собственном ответе. Я даю вам +1 за ответ, который был технически правильным! - person bgroenks; 21.06.2015