【问题标题】:How to make a Java program to generate another Java application at run time如何使 Java 程序在运行时生成另一个 Java 应用程序
【发布时间】:2021-06-05 07:25:31
【问题描述】:

我可以制作一个 Java 程序以在运行时生成另一个 Java 应用程序吗?

我想制作一个“安装程序”,它接受用户输入并根据用户要求生成应用程序,而不是仅仅根据用户需要配置预构建的应用程序。

我遇到了这个解决方案 - how to compile & run java program in another java program?,但我不想让客户在那里安装 JDK。

Dynamically create table and Java classes at runtime - 这也需要JDK,但我有一个解决方法: ToolProvider.getSystemJavaCompiler() returns null - usable with only JRE installed?

  1. 我可以使用上述方法制作完整的应用程序吗?
  2. 生成这样的程序是不是一个坏主意?
  3. 我可以制作这样的 Spring 和 Hibernate 应用程序吗?
  4. 或者是否有任何现有的框架可以做到这一点?

(如果可能的话,它应该在db中创建表并生成html文件。我遇到了http://velocity.apache.org/,所以可以使用它生成java代码。)

【问题讨论】:

标签: java spring


【解决方案1】:

从实际的角度来看,您的目标没有多大意义。希望我的回答能帮助您理解原因。


我可以制作一个 java 程序来在运行时生成另一个 java 应用程序吗?

是的,你可以。但这是很多工作,尤其是如果应用程序很复杂。


我想制作一个“安装程序”程序,它接受用户输入并根据用户要求生成应用程序,而不是仅仅根据用户需要配置预构建应用程序。

这在理论上是可能的。

问题是您必须编写一个能够阅读和理解用户需求的程序,然后将这些需求转换为代码。通常......这是程序员所做的。编写程序来完成程序员所做的事情是不切实际的。 (我的猜测是,做这样的事情比人工智能的“最先进”还要 20 年或更长时间。)

现在,如果问题域受到充分限制,并且要求以明确的符号严格指定,那么这样做可能是可行的。但是,生成程序而不是配置现有程序(基于相同的需求符号)的好处非常小。而且可能不值得付出努力。


...但我不想让客户在他们的计算机上安装 JDK。

如果您要生成 Java 程序,则需要 Java 编译器。因此,如果您坚持使用 JRE(在 Java 8 中),则需要在您的应用程序中包含一个 3rd 方 Java 编译器。

但是,对于 Java 9 以后的版本,这是没有实际意义的:

  • Oracle 不再为 Java 9+ 提供 JRE 发行版,因此您需要让您的客户为其 JRE 使用第 3 方源。

  • 您可以(应该)使用 Java 9+ jlink 实用程序为您的应用程序生成自定义 JRE,其中可以包括标准 Java 编译器。

如果您尝试在字节码级别生成代码,您的问题会立即困难十倍。


抱歉,我使用的是 Java 8

您是否知道 Java 8 已“终止”用于商业用途?这可能会影响您的客户。


  1. 我可以使用上述方法制作完整的应用程序吗?

也许是,也许不是。这取决于问题域。越复杂,要求越多样化/通用,难度就越大。

  1. 生成这样的程序是不是一个坏主意?

是的。这是一个坏主意。这比编写以传统方式配置的应用程序要多得多。 (请注意,配置可能包括用 Java 编写插件、使用某些脚本语言编写规则等等。)

如果您已经拥有一个具有大部分/所有必需功能的常规应用程序,您可以将其用作生成的生成代码的原型,我建议您只生成源代码或字节码。 (如果你不能手工编写这样的原型,那么编写一个生成器来创建它是不现实的。)

即使可行,我也会质疑构建发电机的智慧。额外的努力似乎没有显着的回报。 (例如,最终用户的利益在哪里?)

  1. 我可以制作这样的 spring 和 hibernate 应用程序吗?

我不明白您为什么不能生成这样的应用程序。但请参见 1) 和 2)。

  1. 或者是否有任何现有的框架可以做到这一点?

在某些情况下可以使用一些框架:

  • Velocity1 等模板框架可用于生成 Java 源代码。

  • 字节码工程框架可用于直接生成代码。


1 - 事实上,我使用 Velocity 来生成 Java 源代码。它奏效了,虽然我不相信这是一个理想的解决方案。

【讨论】:

  • “我不想让客户在他们的计算机上安装 JDK。” -> “如果你正在生成 Java 程序,你别无选择。”我不认为这是正确的。您可以使用 graalvm 之类的东西来生成本机二进制文件。
  • 嗯......当然......你也可以在你的应用程序中包含一个 3rd 方 Java 编译器。或者自己写。但这是一个狡辩,无论如何都会在下一段中讨论。
  • 下一段是如何提出的? GraalVM完全支持Java11,客户端不需要安装JDK。
  • 之所以讨论,是因为您无法从 Java 9 开始获得 Oracle JRE。这意味着客户端无论如何都需要安装 JDK ......其中有一个 Java 编译器。 (除非 OP 将永远坚持使用 Java 8。请注意许可证已更改,因此 OP 的客户无论如何都不能将最新的 Java 8 用于商业目的。他们需要支付高级许可证......)
  • 我不明白这有什么关系。您可以使用其他供应商的 JRE,例如 Red Hat OpenJDK 11 JRE,或者您可以构建根本不需要 JRE 的本机可执行文件。
【解决方案2】:

当然可以。您还可以利用 GraalVM 之类的项目为给定平台生成本机二进制文件。

然而,这是一个大量的工作,最终结果可能不会像你想象的那么有用。您刚刚配置为执行不同任务的应用程序可能会更好地服务您想到的任何用例,因此您的努力可能最好花在这个方向上。

【讨论】:

  • 是的,我知道了,谢谢。我在上面的答案中评论了这是为了什么。
猜你喜欢
  • 2013-02-19
  • 2013-05-12
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2015-01-31
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多