在Eclipse插件的运行时编译Java类

在Eclipse插件的运行时编译Java类,java,eclipse-plugin,compilation,java-compiler-api,runtime-compilation,Java,Eclipse Plugin,Compilation,Java Compiler Api,Runtime Compilation,我现在处境很尴尬。 我正在开发一个“Eclipse插件”,它必须将.java文件“编译”成.class文件(甚至可能是一个jar) 我正在尝试使用,以便执行以下操作: public class Compiler { private JavaCompiler _javaCompiler; private StandardJavaFileManager _sjfm = null; private Files[] _filesIn; public Compil

我现在处境很尴尬。 我正在开发一个“Eclipse插件”,它必须将.java文件“编译”成.class文件(甚至可能是一个jar)

我正在尝试使用,以便执行以下操作:

public class Compiler {
    private  JavaCompiler _javaCompiler;
    private  StandardJavaFileManager _sjfm = null;
    private   Files[] _filesIn;

    public Compiler()
    {
        _javaCompiler = ToolProvider.getSystemJavaCompiler();
        _sjfm =  _javaCompiler.getStandardFileManager(null, null, null);
    }

    public  void CompileFiles(ArrayList<String> strings, String outputFolder)
    {
        //_javaCompiler.run
        Iterable fileObject = _sjfm.getJavaFileObjectsFromStrings(strings);
        String[] options = new String[]{"-d", outputFolder};
        _javaCompiler.getTask(null, null, null, Arrays.asList(options), null, fileObject).call();
        try {
            _sjfm.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
公共类编译器{
私有JavaCompiler\u JavaCompiler;
私有标准JavaFileManager_sjfm=null;
私有文件[]\u filesIn;
公共编译器()
{
_javaCompiler=ToolProvider.getSystemJavaCompiler();
_sjfm=_javaCompiler.getStandardFileManager(null,null,null);
}
公共void编译器文件(ArrayList字符串、String outputFolder)
{
//_javaCompiler.run
Iterable fileObject=_sjfm.getJavaFileObjectsFromString(字符串);
字符串[]选项=新字符串[]{“-d”,outputFolder};
_getTask(null,null,null,Arrays.asList(options),null,fileObject.call();
试一试{
_sjfm.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
问题是,当我调用
\u sjfm=\u javaCompiler.getStandardFileManager(null,null,null)时我遇到了一个NullPointerException,因为当不运行JDK时,这是一个“预期”行为(请参考此)

这在某种程度上对我有所帮助,但是从必须可发布的Eclipse插件中编译Java文件的正确方法是什么呢

  • 使用另一种“编译器”,只包含jar并使用它们
  • 在我的插件中包含tools.jar(可以在JDK文件夹中找到),动态加载它,然后从中编译
  • 还有其他我想不出的解决办法吗

  • 你推荐什么

    您可以使用Eclipse JDT编译器,如中所述。

    您可以尝试使用Eclipse JDT编译器:是的,我同意这个想法。我知道eclipse有自己的编译器,但从未想过使用它。贴出答案,我会接受的。