无需编译即可构建Java程序的类似节点模块的方法?

时间:2018-07-22 15:28:03

标签: java java-8

我正在尝试用Java创建模块化结构,其中:

  1. 每个“模块”都可以以松散耦合的方式插入
  2. 无需编译
  3. 每个“模块”具有相同的方法签名

在node.js中,我只需要执行module.exports并要求从另一个文件中使用它即可,但是在Java中,看起来好像没有办法在不编译的情况下运行一段代码。

理想情况下,我想创建一个系统,其中这些模块是即插即用的,就像我可以将文件放在node.js中的目录中并立即需要并使用而没有任何麻烦一样。 Java文件也不能编译为类文件,因为我希望源代码可见。

有这种方法吗?

3 个答案:

答案 0 :(得分:1)

你说

  

我如何将文件放置在node.js中的目录中,并立即要求和使用而没有任何麻烦。 Java文件也不能编译为类文件,因为我希望源代码可见

您的目标尚不完全清楚。编译完代码(可能放在罐子中)之后,如果您希望源代码对程序员可见,请使用像IntelliJ这样的IDE来动态地反编译类,并且您可以导航源代码而无需任何其他反编译步骤

谈到主要问题,如@Mark Rotteveel所说,Don't try to shoehorn Java into something it is not。编译为Java提供了Platform-Independence

您可以在此处查看Java编译背后的原因和优势 How Java Works

答案 1 :(得分:1)

其他人都说过,但这可能不是最好的主意。您可能会尝试将已经知道的一种语言变成一种新语言,而不考虑该新语言实际上可以做什么和不能做什么。

话虽如此,当然,有两种方法可以做您想要的事情:

  1. 为您的部分或全部工作而不是Java写Groovy。 Groovy与Java有99%的兼容性:在大多数情况下,您可以将.java文件重命名为.groovy,并且它们在语法上应无效。在Groovy中,您应该能够动态加载文件并执行它们。

    您还可以在主Java程序中执行Groovy。因此,用Java编写您的主程序,然后调用特殊的Groovy Development Kit类,即可在此处编译您的类。实际上,Jenkins几乎将这件事完全使用Groovy作为脚本语言!

  2. 使用Java编写主程序,但使用Java ScriptEngineManager调用其他语言的其他代码。实际上,使用此概念可以使您从实际的 Javascript 调用Java类。这可能超级有用,具体取决于您要执行的操作。只需将主程序编译为Java。

  3. 执行第1项,只是选择与Java语法不太兼容的语言。我怀疑Kotlin可能具有一些功能来动态加载文件。

  4. 您实际上可能正在尝试用Java构建插件架构。我怀疑至少有一些关于此主题的博客条目。这可能需要对插件进行编译,但是如果操作正确,则主程序将不会对特定插件有任何依赖关系。同样,这可能是一个选项,具体取决于您要去的地方(尝试构建自己的Minecraft或Photoshop?)

答案 2 :(得分:0)

其他答案中已经列出了许多不错的选择(和警告)。

另一种选择:编写一个聪明的Java main,拾取源文件,透明地编译它们(如果愿意,在用户的后面):)并将结果加载到当前的JVM中。官方方式将通过JSR 199

Eclipse调试器是此类即时编译和执行的一个很好的例子。用户选择一个代码片段并检查其评估的值。没有人注意到该代码段是在后台进行编译的(除非您有编译错误,即)。 JSP遵循类似的路径等。