编译在运行时引用当前程序类的java代码

时间:2014-08-26 23:07:06

标签: java plugins compiler-construction compilation interpreted-language

我正在尝试编写一个允许用户创建“插件”的程序。有点像Linux bash shell可以通过将文件放在目录中来添加命令,我试图让用户将他们的代码放在一个目录中,并让我的程序执行它。

我想到了几种方法:

  1. 以某种方式设法创建自己的脚本语言并让用户使用它来编写插件
  2. 查找Java支持的现有脚本语言,并将其用于用户编写插件
  3. 让用户用Java编写插件,并在程序运行时编译它们。
  4. 虽然所有3个选项看起来都很糟糕,但这是我能想到的全部,而选项3似乎是三者中最好的。所以,我做了一些研究,发现Java 1.6以后支持文件的运行时编译。但是,如果用户编写的代码引用了我在基本程序中的一些特定类,我不确定编译器是否会失败。通常它会,但由于我的程序正在编译它,我不知道编译器是否允许它们使用基本程序中的类。

    理想情况下,我希望用户尽可能轻松。我的主要问题是编译器是否会在我的基本程序中引用类时出现问题。我不希望在我的所有类中包含.jar,并且让用户在开发时将其用作库。正如我所说,我希望这对用户来说很容易,理想情况下,它应该尽可能接近解释语言。这就是为什么我想在我的程序中在运行时执行此操作,以便用户不必费心进行编译。他们只需要将.java文件放在一个目录中并运行我的程序。

    如果有人知道编译器是否会遇到类的问题,或者他们知道更好的方法,那就太棒了!

    谢谢!

1 个答案:

答案 0 :(得分:1)

Java应用程序的大多数插件都是用Java编写的。插件是一项棘手的业务,因为它们暴露了许多潜在的坏事。

如果要将脚本语言编译为Java,那么确定。你必须:

  1. 创建Java类http://www.javabeat.net/the-java-6-0-compiler-api/
  2. 建立一套脚本可以做什么和不能做什么的规则。
  3. 调用编译器w /对要暴露给该Java类的API Jar的引用(因此编译器可以跟随引用链)
  4. 仅将Java类而不是API jar加载到当前ClassLoader的Sub ClassLoader中。 http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html
  5. 如果使用当前加载的相同API jar编译目标* .java,则类引用应该没有问题。不要在SUB CLASSLOADER中加载API JAR,因为会发生类类型错误。

    查看LuaJava的脚本引擎。

    http://www.keplerproject.org/luajava/manual.html