在eclipse插件中,以编程方式将新的.java文件保存到工作区中的现有jar文件中

时间:2013-11-26 03:37:31

标签: java jar eclipse-plugin

我正在为Eclipse Standard/SDK Kepler编写一个插件,以便在本科学生程序员从事Java编程任务时提供诊断反馈。学生可以经常运行我的插件,因为他希望看到他的代码是否会触发有关他可能想要改变的糟糕编程习惯的任何消息。

每次学生调用插件时,我都需要保存学生项目中所有.java文件的副本以及包含插件产生的诊断反馈的文本文件。我不想让学生使用文件导出向导,因此我想出了如何使用JarPackageData中的JarWriter3org.eclipse.jdt.ui.jarpackager类以编程方式创建jar文件。这是我第一次保存文件,但我不希望每次学生运行插件时都创建一个新的jar。当学生在第二个(第三个,第四个......)时间运行我的插件时,我想在我已经制作的jar中添加更多文件,这样我最终得到一个jar文件,其中包含学生使用的完整记录。我的插件。

JarWriter3创建一个新的jar文件,但不提供任何方法来添加到已存在的jar中。我搜索了Eclipse文档和stackoverflow存档,到目前为止还没有成功。上一个问题的一个答案解释了如何使用java.util.jar.JarEntryJarOutputStream类编写jar文件,但我认为我应该坚持Eclipse类提供的功能,如果确实有任何可以解决我的问题的话。

1 个答案:

答案 0 :(得分:1)

JarWriter3本质上只是JarOutputStream的一个相当薄的包装器,例如构造函数打开jar输出流:

if (fJarPackage.usesManifest() && fJarPackage.areGeneratedFilesExported()) {
  Manifest manifest = fJarPackage.getManifestProvider().create(fJarPackage);
  fJarOutputStream = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(fJarPackage.getAbsoluteJarLocation().toFile())), manifest);
} else
  fJarOutputStream = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(fJarPackage.getAbsoluteJarLocation().toFile())));

因此我倾向于使用标准Java JarOutputStreamJarEntry

如果要在工作区中保存jar,则需要在编写jar后调用IFile.refreshLocal以使Eclipse识别它。