【问题标题】:How can I see the classes on the java classpath at runtime in a non-maven project? [duplicate]如何在非 Maven 项目中在运行时查看 java 类路径上的类? [复制]
【发布时间】:2018-02-15 09:53:57
【问题描述】:

我在 Eclipse 中有两个具有相同声明依赖项的项目。一组单元测试有效,而另一组则无效。我收到一个错误No tests matching [*methodname*]。一些谷歌搜索提出了图书馆问题,但我无法确定可以在哪里引入这些问题。项目几乎相同,测试框架(junit、powermock、mockito)应该相同。在首选项 - > java build path 中查看 java build path 会显示相同的引用。我怀疑 Eclipse 菜单没有反映运行时加载的实际类。有没有办法在运行时回显类路径,以便我可以扫描它以查找重复项?

更新:根本问题是我在类路径上的 junit 和 powermock 版本存在冲突。我能够通过从 Eclipse 构建路径配置面板中删除、重新添加和重新排序 jar 来解决此问题。这是非常乏味的,下面接受的解决方案将大大减少解决时间。

这个问题被标记为重复,但链接的文章特定于 maven,并没有解决在运行时查看类路径的潜在问题。公认的解决方案对于 Maven 和非 Maven 项目都是可行的。

【问题讨论】:

  • 您是否在使用像 JUnitParams 这样的附加库?我昨天也遇到了类似的问题,原因是参数准备代码抛出了异常,eclipse显示为“没有测试匹配”。
  • 项目和启动/运行配置的类路径可能不同。两个启动/运行配置是否具有相同的类路径?
  • 如果您使用真正的依赖管理系统,例如 Maven、Gradle 甚至 Ivy,您就不会遇到这些问题。
  • @JarrodRoberson 我马上意识到这一点。查看我的其他帖子以确认。我们在我们提供的限制范围内工作。 @howlger 这就是我要调查的内容。我正在通过right click > run as > junit test 在 Eclipse 中运行单元测试。我将如何查看这些运行的配置? @Absurd-Mind 原来的根本问题是我的路径上有相互冲突的 powermock 和 junit 版本。我很怀疑,但在构建路径中进行了很多猜测和检查,以查看在哪里引入了冲突版本。

标签: java eclipse junit classpath classloader


【解决方案1】:

有几种方法可以在运行时调查实际的类路径:

  • 使用-verbose:class 运行您的 JVM。这将产生如下输出:

    [Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/rt.jar]
    [Loaded java.io.Serializable from /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/rt.jar]
    
  • 在您的 JVM 中运行以下代码:

    ClassLoader classloader = ClassLoader.getSystemClassLoader();
    
    URL[] urls = ((URLClassLoader) classloader).getURLs();
    
    for (URL url : urls) {
        System.out.println(url.getFile());
    } 
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2015-05-30
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多