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

标签 java jar eclipse-plugin

我正在为 Eclipse Standard/SDK Kepler 编写一个插件,以便在本科生程序员完成 Java 编程作业时向他们提供诊断反馈。学生可以根据需要多次运行我的插件,看看他的代码是否会触发有关他可能想要更改的不良编程实践的任何消息。

每次学生调用插件时,我都需要保存学生项目中所有 .java 文件的副本以及包含插件生成的诊断反馈的文本文件。我不想让学生使用文件导出向导,因此我想出了如何使用 org.eclipse.jdt.ui.jarpackager 中的 JarPackageDataJarWriter3 类以编程方式创建 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 JarOutputStreamJarEntry

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

关于java - 在 Eclipse 插件中,以编程方式将新的 .java 文件保存到工作区中现有的 jar 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208039/

相关文章:

python - 创建上下文后将 jar 文件添加到 pyspark

java - 如何获取要包含在 Okta java-api 调用的类路径中的 jar 文件列表?

java - 用于插件部署的 Eclipse 最小配置

eclipse - 检查ColdFusion 的样式?

java - 使用序列化查找 Java 对象大小

java - 将反射与 Realm 结合使用 (Android)

java - 使用 implements Serializable 时在类型 com.sun.proxy.$Proxy127 上找不到属性

java - 网格: 6 x 7 Square Cells

java - 运行 JAR(Fxyz3d 库)时出现 FileSystemNotFoundException

android - 如何从 Android SDK 中内置的 Eclipse UI 发出 adb 命令