【问题标题】:How to find out which class is loaded at compile time?如何找出在编译时加载了哪个类?
【发布时间】:2015-02-27 13:12:03
【问题描述】:

我有一个有很多依赖项的项目,并且在我的代码的某个地方我正在实现一个类,如下所示:

public class MyApp extends org.some.BaseClass

问题是,提供基类org.some.BaseClass 的依赖项中有多个jar,其中一些包含我需要实现的特定抽象方法,其他则没有。显然,编译器想要使用我不想实现的那些基类之一,但它失败了:

[ERROR] MyApp is not abstract and does not override abstract method getSome() in org.some.BaseClass

现在,从这里:Find where java class is loaded from 我了解了 jvm opt -verbose:class,它列出了所有正在加载的类以及从何处加载它们。出于分析目的,这似乎非常好。但是,我猜由于当时编译器仍在工作并且类尚未完全加载,因此org.some.BaseClass 的源代码不会打印在输出中。编译器只是失败并且没有提及任何细节。

那么,我怎样才能在编译时找出正在编译的类呢?对于有编译错误的文件,是否还有另一个 jvm 标志可以打印与 verbose:class 相同的信息?

更新:

通过在 javac 参数中添加 -verbose 解决。原来错误的类来自一个阴影 jar,该 jar 直接包含其依赖项中的所有类。 IDE 无法告诉我这一点,因为该 jar 也是作为模块的项目的一部分。

【问题讨论】:

    标签: java compilation compiler-errors


    【解决方案1】:

    来自javac 手册:

    -verbose - 详细输出。这包括有关加载的每个类和编译的每个源文件的信息。

    【讨论】:

    • 谢谢,这个提示很有帮助:我正在使用 maven 构建项目,我需要将详细参数传递给 javac,而不是执行 maven 的 java 进程。
    • 将详细参数传递给 Maven 编译器运行 mvn compile -DcompilerArgs=-verbose
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2020-04-24
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多