【问题标题】:Compile a Java program on the server right before a User downloads the program在用户下载程序之前在服务器上编译 Java 程序
【发布时间】:2011-01-28 17:03:19
【问题描述】:

我进行了快速搜索,但找不到有关此主题的任何内容。我什至不确定这是否可能,但我很好奇。

是否可以在用户下载程序之前在服务器上编译 Java 程序。我能想到的应用程序是在用户下载程序之前动态修改程序的源代码。这在根据用户输入或网站上的设置修改程序的设置中可能会有所帮助,并且这些更改很难嵌入到程序中,因此他们下载的是一个可定制且完全可移植的独立程序。我想到的另一个应用程序是,如果每个用户在程序中使用不同的功能组合,那么它只使用他们需要/想要的功能集进行编译。

我有一些程序想法可以用来测试,但这主要是我的学术想法和好奇心。

长话短说,有没有人知道可以使这样的系统工作的任何技术?

【问题讨论】:

  • 您是否正在寻找某种心理服务器来了解用户何时将下载该程序?
  • 即使有可能,我还是建议为每个用户打包应用程序并简单地修改一些配置文件(JNLP 非常适合!)
  • @Falmarri,不再像用户在 Web 表单上选择功能集,然后程序被“烘焙”,因此它特定于他们的配置。是的,我可以使用配置文件等来完成这一切,但正如我所说,这个问题是出于好奇而提出的,因为“这可能吗”而不是“我想这样做”
  • @Joachim Sauer,是的,我肯定需要更多地研究 JNLP。考虑到这一点,Java Web Start 最初激发了我的好奇心,我想我很可能能够使用 JNLP 来完成它。我肯定需要更多地研究它。

标签: java compilation jit on-the-fly


【解决方案1】:

当然,这是可能的。

只需让下载链接指向某个脚本,该脚本编译/打包源代码并将结果发回。这可以在 PHP 中实现,只需几行代码。它与验证码非常相似:动态生成唯一数据,通过 URL 检索。

我自己考虑过这个想法,用于协议混淆和“软件注册密钥算法”生成。

但是,我建议您将要重新编译的部分分解为单独的类/类集,仅编译这些部分,并根据要求将其与(已编译的)程序的其余部分一起打包。

【讨论】:

  • 嗯,我希望这是可能的。我使用 PHP 作为我的主要服务器语言,PHP 中是否有内置的东西可以让我编译 Java。我四处寻找它,但找不到太多关于该主题的信息。我假设我需要在服务器上安装 Java 编译器。是否有任何易于在服务器上实现的 java 编译器,或者假设我已经安装了一个,我将如何从 PHP 调用它?
  • 我也喜欢你关于编译基础程序的建议,并且只编译可能可变的功能。这是一个好点。我可能最终会得出那个解决方案,但是从一开始就有这个想法真是太好了。
【解决方案2】:

我已经使用 Compile API(Java 6 附带)编写了一个库来编译 ememory 中的代码,但我建议您不需要预先生成代码,因为您可以使用动态生成的代码来执行任何操作代码。可能会有一点性能优势,但我建议您尝试使用动态代码(即带有循环、if 语句和反射的代码)来执行您生成的代码首先会执行的操作,因为这更简单并且可能会执行你要。

即使您必须生成代码,首先以非生成形式编写代码也很有用,这样您就可以清楚地知道您需要代码做什么。

【讨论】:

  • 我完全同意你的看法,我的那部分问题纯粹是学术性的,我不确定这是否可能。我最感兴趣的只是编译用户即时需要的功能。为了保持程序的大小尽可能小,这对于 Java Web Start 实现更为重要,这样程序就可以尽可能快速无缝地下载并开始执行。
  • 生成的代码往往比相同的动态代码大得多。 (到了可以测试编译器或 JVM 限制的程度)要确保它更小是非常困难的。
  • 我并没有真正考虑生成代码。更多类似的说法是,您拥有一组功能,但大多数用户只会使用这些功能的一个子集。因此,我将让服务器仅使用功能子集而不是全部 10 个功能来编译程序。当然,这会因实现而异,但在某些情况下可能会有用。
  • 您可以将功能放在不同的 jar 中,让客户端只下载它需要的 jar。我没有使用它,但你可以建立一个索引,说明哪些包/类在哪些 jars 中,它应该锻炼为你下载哪些 jars。如果没有,你可以自己做。
猜你喜欢
  • 2017-09-04
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多