【问题标题】:Getting ClassNotFound for PaxExam Option class when running test运行测试时找不到 Pax 考试选项类的类
【发布时间】:2015-08-31 14:36:58
【问题描述】:

使用 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 从另一个提供默认 @Configuration 方法的包中(动态)导入。此捆绑包(当前)没有显式导出或导入 pax 考试类,所以这可能是问题的一部分?

我会在测试后再次更新问题以找出答案。

【问题讨论】:

  • 更多关于您的测试设置的详细信息可能会有所帮助
  • 见 OP 进行更新;测试设置包括通过接口默认方法提供的@Configuration 方法的默认实现。这是我能想到的唯一值得注意的事情。

标签: java osgi classpath pax-exam


【解决方案1】:

您的捆绑包需要导入包org.ops4j.pax.exam,例如META-INF/MANIFEST.MF 中的类似内容:

Import-Package: org.ops4j.pax.exam

更新:请参阅this wiki page 了解更多信息。

【讨论】:

  • 但是 Pax 的全部意义在于它应该从您的测试中动态创建一个包并动态导入内容。为什么我需要导入那个包?
  • 我认为这只是一个奇怪的类路径问题。一旦事情进入 OSGi 环境,所有的地狱都会被这些东西打破:(
  • 错误,没有“类路径”之类的东西。
  • 你的意思是在 OSGi 中吗?从技术上讲……它只是被包导入/导出系统掩盖了。
  • 只有捆绑包中有一个类路径。包导入和导出不会掩盖全局类路径,它们会替换它。所以这不是一个有用的概念。
【解决方案2】:

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

为了说明导入:

A 类

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

我想,接下来的教训是检查你的其他依赖包的声明依赖项

希望这可以帮助将来遇到此问题的其他人!

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2017-09-16
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多