我可以强制我的java程序使用jdk而不是jre执行吗?

我可以强制我的java程序使用jdk而不是jre执行吗?,java,Java,我一直在寻找答案,但运气不好 我一直在用java开发一个使用javax.util.JavaCompiler类的游戏。我发现这不适用于JRE,因为当我调用编译器的run方法时,我会得到一个空指针异常(我假设他们只是没有随JRE一起提供编译器,这是完全可以理解的) 我现在的问题是,我的游戏本质上依赖于JDK。是否有可能强制我的游戏以某种方式搜索系统环境变量,而不是使用jdk执行自己 我曾尝试使用一个单独的启动器,然后搜索jdk并通过它执行游戏,但感觉很混乱,我担心可能会有我遗漏的因素。这在技术上是可

我一直在寻找答案,但运气不好

我一直在用java开发一个使用javax.util.JavaCompiler类的游戏。我发现这不适用于JRE,因为当我调用编译器的run方法时,我会得到一个空指针异常(我假设他们只是没有随JRE一起提供编译器,这是完全可以理解的)

我现在的问题是,我的游戏本质上依赖于JDK。是否有可能强制我的游戏以某种方式搜索系统环境变量,而不是使用jdk执行自己


我曾尝试使用一个单独的启动器,然后搜索jdk并通过它执行游戏,但感觉很混乱,我担心可能会有我遗漏的因素。

这在技术上是可能的,但它会让你的应用程序启动缓慢,无法进行彻底的搜索。抱歉,没有支持的方法可以做到这一点

由用户选择如何运行Java应用程序。做一些聪明的事情,比如搜索JDK安装,可能会有危险。(您可能最终选择了一个用户不知道或忘记卸载的不安全的旧JDK。这可能会让用户面临安全漏洞,等等。)


我建议您只向用户发送一条友好的消息,说明他们需要安装和/或使用JDK。

您有以下选项:

  • 在应用程序启动期间检查该类是否存在;如果找不到,则向用户提供一条清晰的错误消息,说明他需要使用JDK运行(您还可以在用户下载应用程序的站点上将其指定为“prerequesites”)
  • 退一步,仔细分析解决方案所依赖的类。然后你要么重新打包这些类;或者,您可以简单地将相应的JAR文件与应用程序一起提供
  • 你看,要求用户安装JDK对他们来说是一个很大的负担。甚至当你谈论一些“公司间”产品时,人们不得不使用它。。。很少有人愿意安装JDK。您绝对不应该期望许多用户安装了JDK


    另一方面,当你考虑重新包装的东西;你还必须研究法律方面的问题;您不想通过向客户分发与JDK相关的JAR来违反任何许可证规则。

    您不需要使用JDK运行应用程序。您仍然可以使用JRE运行它。您需要做的就是确保类路径中有一个包含应用程序所需类的jar(来自JDK或其他任何地方)。您可以通过在安装中包含所需的JAR,或者在运行应用程序时在类路径参数(-cp)中包含所需JAR的路径来实现。若你们想让你们的应用程序在只安装了JRE的计算机上运行,你们必须在你们的安装中包含所需的JAR。将其视为您使用的任何其他第三方库,因此您必须将这些库JAR打包到您的应用程序JAR/WAR

    您可以简单地在使用编译器API的周围为NPE设置一个try/catch块,并且在发生错误的情况下,毫不含糊地将需求告知用户


    或者,您可以使用asm或其他一些代码生成器包来避免对编译器的需要。

    我找到了问题的解决方案。感谢所有说我应该用编译器打包我的游戏的人。我找到了作者描述的文章,而不是使用eclipse编译器。显然javax.tools.JavaCompiler只是提供的一个公共接口,我真的应该更详细地学习API。

    也许你只需要在游戏中捆绑一个OpenJDK?然后您可以完全控制执行环境,并确保编译器可用。