我试图在Cloud Foundry Java应用程序中调用javac来在应用程序运行时编译java文件。我有一个关于使用哪个JDK的问题。
为了测试这一点,在我的应用程序中,我使用语句ToolProvider.getSystemJavaCompiler()实例化JavaCompiler并打印出编译器实例。该应用程序部署在CF上并打印出来: com.sun.tools.javac.api.JavacTool@2e68d3ad
以下内容来自日志。
- - - - > Java Buildpack版本:v3.13 | https://github.com/cloudfoundry/java-buildpack.git#03b493f 2017-04-24T13:23:21.38-0700 [STG / 0] OUT -----> 从https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz(0.5秒)下载Open Jdk JRE 1.8.0_121 2017-04-24T13:23:22.48-0700 [STG / 0] OUT将Jdk JRE打开扩展为.java-buildpack / open_jdk_jre(1.0s)
两个问题:
任何见解将不胜感激。谢谢。 -Michelle
答案 0 :(得分:1)
假设在Cloud Foundry上始终可以使用JDK是安全的,所以我可以使用javac。
构建包未安装javac
实用程序。如果仔细观察它的安装,你会发现它正在安装JRE而不是JDK。 JRE只是运行时,不包含javac
。
2017-04-24T13:23:21.38-0700 [STG / 0] OUT ----->从https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz(0.5s)下载Open Jdk JRE 1.8.0_121
注意它是如何说“Open JDK JRE”的。 “Open JDK”是Java实现的名称,“JRE”是类型。
您可以通过将cf ssh
运行到使用Java构建包部署的应用程序来确认。如果查看/home/vcap/app/.java-buildpack/
,您可以看到所有安装的内容。
这就是我在bin
目录下看到的全部内容。
~/app/.java-buildpack/open_jdk_jre$ ls bin/
java jcmd jmap keytool orbd policytool rmiregistry tnameserv
java-buildpack-memory-calculator-2.0.2_RELEASE jjs jstack killjava.sh pack200 rmid servertool unpack200
为什么我的代码中实例化的编译器引用了Sun的javac?我期待OpenJDK JDK(即使日志只说下载了JRE)。
我怀疑是因为OpenJDK来自Sun,所以仍有一些共同的遗产。