【问题标题】:Is it possible to preview which class files will Java compiler generate?是否可以预览 Java 编译器将生成哪些类文件?
【发布时间】:2014-12-18 06:51:30
【问题描述】:

是否有javac 的选项,比如--dry-run,它将指示编译器不进行实际编译,而是解析源文件并列出哪些.class 文件(包括包路径)会生成吗?

考虑这个例子:

$ cat example.java
package whatever.example;
class First {}
class Second {}
$ javac -d . example.java
$ find .
.
./example.java
./whatever
./whatever/example
./whatever/example/First.class
./whatever/example/Second.class

源文件被编译成两个.class 文件,并在指定-d 选项时生成了包结构。我想知道这些信息之前编译。像这样的:

$ javac --dry-run -d . example.java
./whatever/example/First.class
./whatever/example/Second.class

或者,如果javac 没有这样的选项,是否有任何第三方实用程序可以做这样的事情?

【问题讨论】:

  • 我不知道有什么这样的选择——但考虑到它无论如何都要做很多工作,为什么不直接编译到一个临时目录呢?
  • 编译到临时目录需要“解析结果”。使结果可靠最终将编写一个专门的实用程序。在这样做之前,我想知道我有哪些选择。
  • 我不知道你所说的“解析结果”是什么意思——你只是在遍历目录树。这如何涉及解析?
  • 那是“解析”这个词的奇怪用法,IMO。通常,人们会解析某种描述的数据流,将其从一种格式转换为另一种格式或对象……我绝对不会将“调用File API”称为解析操作。无论如何,总而言之,我不知道有什么可以做到这一点 - 也不希望这样做,因为它似乎是一个非常小众的用例。
  • 我们还需要为 qbs 构建系统执行此操作。我最终为此使用了 Java 编译器 API(WIP):codereview.qt-project.org/160346

标签: java packages javac


【解决方案1】:

试试

javac -verbose -d . javaclass.java

这实际上列出了编译器正在处理的所有操作。最后,您可以使用包结构生成所有类。

我通过上面的代码有编译器。我在列表末尾得到以下输出。

[wrote RegularFileObject[.\com\SC\JustTesting.class]]
[wrote RegularFileObject[.\com\SC\JustTestingSecond.class]]

还有很多其他选项,只需在命令提示符下输入javac 即可查看。

我不知道我是否可以在编译之前知道这些信息。

【讨论】:

  • 太棒了!问题解决了一半。但是,这将编译和写入文件。有什么办法可以禁用这个?当然,正如@Jon Skeet 所建议的那样,我可以编译到一个临时目录,但在我看来,这似乎有点过头了。也许有办法以编程方式进行“试运行”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多