运行测试时获取PaxExam Option类的ClassNotFound

时间:2015-06-15 23:01:39

标签: java osgi classpath pax-exam

使用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)

即使PaxExam JAR(和所有依赖项)都在Maven类路径上,也会发生这种情况。

我一直在努力寻找解决这个问题的方法很长一段时间;我真的很感激任何人都可以给予的建议。感谢。

编辑:

错误似乎是由于每个测试都是从另一个提供默认BundleTest方法的bundle实现(动态)导入的接口@Configuration。这个包没有(当前)显式导出或导入pax考试类,所以这可能是问题的一部分?

我会在测试后再次更新问题。

2 个答案:

答案 0 :(得分:1)

问题确实似乎是该类通过导入引用另一个导入Pax类的类。

说明导入:

A级< - B级< - Pax

问题是B类没有在Bundle清单中导入Pax Exam类。因此,当Pax为A类中的测试类创建动态导入时,B类来自另一个bundle。这意味着OSGi没有解决B类的进口问题。

我认为,当然,检查其他依赖包的声明的依赖关系

希望这有助于将来遇到此问题的其他人!

答案 1 :(得分:0)

您的捆绑包需要导入包org.ops4j.pax.exam,例如在META-INF / MANIFEST.MF中这样的事情:

Import-Package: org.ops4j.pax.exam

更新:有关详细信息,请参阅this wiki page