我们正在使用带有自己的SDK的产品。此 SDK 包含:
- 它自己的 JRE 安装
- 这是自己的蚂蚁安装
- 一些用于构建内容的 Ant 脚本
- 使用包含的脚本调用 Ant 的几个批处理脚本
现在,一些 Ant 脚本使用javac
任务编译 Java 代码。现在我想找到用于此目的javac
可执行文件。我已经检查了以下内容:
- 批处理脚本临时将
JAVA_HOME
设置为包含的 JRE。整个过程无需安装另一个JDK即可工作。 - 包含的 JRE 是 JRE,而不是 JDK。所以找不到
javac.exe
。 - SDK 中没有其他任何位置包含
javac.exe
。 build.compiler
似乎没有在 Ant 脚本中的任何位置设置。fork
、executable
和compiler
属性不会在任何javac
任务上设置。
我不知道去哪里看。还有什么其他可能性?如何找到使用的 Java 编译器可执行文件?
我现在省略了任何 Ant 片段或类似内容,因为它们非常复杂,而且我不能 100% 确定哪些部分是相关的。如果您想查看某个部分,请在评论中告诉我。
编辑
到目前为止,感谢罗伯特的新见解:
有几个taskdef
.它们中的大多数都引用了jar中的一个类,实现了Task
。它们都不导入任何与编译器相关的包。但是,也有作为库加载的ant-contrib:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="${ant.home}/lib/ant-contrib.jar"/>
</classpath>
</taskdef>
我不熟悉这个库,但它似乎包含一些可以进行编译的任务。CompileWithWalls
进口org.apache.tools.ant.taskdefs.Javac
.但是 Ant 脚本中不会调用compilewithwalls
目标。问题仍然存在:如果从这些库中使用编译器,它将如何绑定到默认javac
任务?
我的一位同事终于解开了这个谜团。
我所知道的是,Ant 使用位于JAVA_HOME
下的 JDK。然而,在错误的假设下,我使用 Ant 使用javac.exe
进行编译。嗯,它没有。蚂蚁使用位于tools.jar
中的sun.tools.javac.Main
。那个 Jar 以及javac.exe
只附带一个 JDK,但就我而言,它包含在产品 SDK 中并手动添加到 Ant 的类路径中。
延伸阅读: http://mindprod.com/jgloss/javacmain.html