我正在为 Eclipse Standard/SDK
Kepler 编写一个插件,以便在本科生程序员完成 Java 编程作业时向他们提供诊断反馈。学生可以根据需要多次运行我的插件,看看他的代码是否会触发有关他可能想要更改的不良编程实践的任何消息。
每次学生调用插件时,我都需要保存学生项目中所有 .java 文件的副本以及包含插件生成的诊断反馈的文本文件。我不想让学生使用文件导出向导,因此我想出了如何使用 org.eclipse.jdt.ui.jarpackager
中的 JarPackageData
和 JarWriter3
类以编程方式创建 jar 文件。这在我第一次保存文件时有效,但我不想在学生每次运行插件时创建一个新的 jar。当学生第二次(第三次、第四次……)运行我的插件时,我想向我已经制作的 jar 添加更多文件,以便最终得到一个包含学生使用插件的完整记录的 jar 文件。
JarWriter3
创建一个新的 jar 文件,但不提供任何添加到已存在的 jar 的方法。我已经搜索了 Eclipse 文档和 stackoverflow 存档,到目前为止没有成功。上一个问题的一个答案解释了如何使用 java.util.jar.JarEntry 和 JarOutputStream 类编写 jar 文件,但我认为如果确实有任何类可以解决我的问题,我应该坚持使用 Eclipse 类提供的功能。
最佳答案
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 JarOutputStream
和 JarEntry
。
如果您将 jar 保存在工作区中,则在编写 jar 后需要调用 IFile.refreshLocal
以使其被 Eclipse 识别。
关于java - 在 Eclipse 插件中,以编程方式将新的 .java 文件保存到工作区中现有的 jar 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208039/