列出javac编译的Java源文件

Posted

技术标签:

【中文标题】列出javac编译的Java源文件【英文标题】:List the Java source files compiled by javac 【发布时间】:2018-11-09 21:52:47 【问题描述】:

我有一系列通过 CLASSPATH 引用大型代码存储库的小型 Java 项目(*.java 文件中的类)。代码存储库包含大量 *.java 文件(源文件)和一些 *.jar 文件。我想将任何给定的项目与其目录分开,以便打包并分发它。

给定一个包含 main 方法的 Java 类作为给定项目的起点,如何列出 CLASSPATH 上用于编译给定 Java 的所有文件,例如 *.java 文件或 *.jar 文件班级? javac可以在编译过程中产生一个足够详细的日志吗?你能单独使用 Java API 并以编程方式检查用于编译的源文件吗?

【问题讨论】:

Java 类是从单个 .java 文件单独编译的。你是在问如何找到一个类的依赖关系? '列出在 CLASSPATH 上找到并由 javac 编译的 Java 源文件':简单。没有。源文件不是通过 CLASSPATH 定位的。 是的,这是关于找到一个类的依赖关系 - 在给定类和类路径的编译时刻。 好点 EJP。在类路径中可以找到很多不同的文件,因此我们需要通过记录 javac 的活动并检查依赖关系来查看哪些文件正在使用中。有人愿意推荐一个依赖检查工具吗? 否:在编译过程中,只能通过 CLASSPATH 找到 .class 文件。不是“很多不同的文件”。 【参考方案1】:

javac 能否在编译过程中生成包含足够详细信息的日志?

javac-verbose 选项,它可以告诉您哪些 JAR 位于类路径以及哪些 Java 文件已编译。

javac -verbose <filepath>

示例输出(编译使用 Dummy2.java 和一些 JDK 类的 Dummy.java):

[parsing started RegularFileObject[Dummy.java]]
[parsing completed 10ms]
[search path for source files: .]
[search path for class files: C:\Program Files\Java\jdk1.7.0_80\jre\lib\resources.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\rt.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\sunrsasign.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\jsse.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\jce.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\charsets.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\jfr.jar,C:\Program Files\Java\jdk1.7.0_80\jre\classes,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\access-bridge-64.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\dnsns.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\jaccess.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\localedata.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunec.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunjce_provider.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunmscapi.jar,C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\zipfs.jar,.]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/io/File.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking Dummy]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/net/URI.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[loading RegularFileObject[.\Dummy2.java]]
[parsing started RegularFileObject[.\Dummy2.java]]
[parsing completed 0ms]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/StringBuilder.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AbstractStringBuilder.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_80\lib\ct.sym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]]
[wrote RegularFileObject[Dummy.class]]
[checking Dummy2]
[wrote RegularFileObject[.\Dummy2.class]]
[total 257ms]

【讨论】:

好主意,瓦桑。我想知道如果我们添加日志选项“-Xstdout 文件名”,我们是否可以解析日志文件并找到给定类的所有编译时依赖项,所有用于编译的源文件?

以上是关于列出javac编译的Java源文件的主要内容,如果未能解决你的问题,请参考以下文章

javac: 找不到文件: HelloWorld.java 用法: javac <options> <source files> -help 用于列出可能的选项

如何用javac命令编译一个目录以及子目录下所有的java文件呢?

javac 编译,如何引用定义在其他文件夹的包

Java千百问_08JDK详解(007)_javac是什么

javac编译乱码

深入分析 Javac 编译原理