0

我正在开发一个 Eclipse 插件,它对文件的两个版本的差异运行代码违规检查器。现在我正在使用diff.exe来获取两个文件之间的差异。但是由于 diff.exe 是一个外部应用程序,我意识到最好使用 eclipse 内置的比较工具来获取文件差异。所以我使用了org.eclipse.compare并达到了这一点:

public static List<Patch> compare(String old, String recent) {
    try{
        IRangeComparator left = new TokenComparator(old); //what exactly to be passed in this constructor, a file path, a literal value or something else?
        IRangeComparator right = new TokenComparator(recent); 
        RangeDifference[] diffs = RangeDifferencer.findDifferences(left, right); // This line is throwing NPE

        //..
        // Process RangeDifferences into Collection of Patch collection
        //..
    }catch(Exception e){}

    //Returns  a collection of file differences.
    return null;
}

现在的问题是我不确定要在构造函数TokenComparator(String)中传递什么。文档说这个 构造函数为给定的字符串创建一个 TokenComparator。但是并没有写出到底要在这个构造函数中传递什么,文件路径,文字值或其他什么?当我传递文件路径或字符串文字时,我在查找差异的下一行得到 NullPointerException。

java.lang.NullPointerException
    at org.eclipse.compare.internal.core.LCS.isCappingDisabled(LCS.java:98)
    at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:55)
    at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186)
    at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31)
    at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98)
    at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82)
    at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67)
    at com.dassault_systemes.eclipseplugin.codemonview.util.CodeMonDiff.compare(CodeMonDiff.java:48)
    at com.dassault_systemes.eclipseplugin.codemonview.util.CodeMonDiff.main(CodeMonDiff.java:56)

有人请告诉什么是正确的方法。

4

2 回答 2

0

org.eclipse.compare插件从来没有打算单独使用:它的许多功能需要运行的 Eclipse 实例。此外,它将核心代码和 UI 代码混合在同一个插件中,如果您对使用的内容和环境中实际可用的依赖项不太小心,这将导致意外行为。

您提到您正在开发一个 Eclipse 插件。但是,您获得的 NPE 表明您没有将代码作为 Eclipse 插件运行,而是作为标准 Java 程序运行。在 Eclipse 环境中,ComparePlugin.getDefault()不能返回null:需要启动插件才能使该调用返回除null之外的任何内容.... 并且仅在 Eclipse 中加载ComparePlugin类就足以启动它。

答案将是一个选择:

  1. 您需要您的代码在 Eclipse 之外作为独立的 Java 程序运行。在这种情况下,您不能使用 org.eclipse.compare,而diff.exe可能是您的最佳选择(或者您可以切换到用 Java 实现的diff实现,以便独立于平台)。
  2. 您不需要您的程序在独立环境中工作,只需作为 Eclipse 插件即可。在这种情况下,您可以保留正在使用的代码。但是,当您运行代码时,您必须将其作为新的“Eclipse 应用程序”而不是“Java 应用程序”启动。您可能想查看有关如何为此开发 Eclipse 插件的教程,Lars Vogel 的这个简单教程展示了如何运行新的 Eclipse 应用程序来测试 Hello World 插件。您将需要一个类似的代码,并带有一个菜单条目以在某处启动您的插件(右键单击一个文件,然后在您的情况下选择“检查违规”?)。
于 2013-01-06T12:44:52.233 回答
0

如果问题是令牌比较器构造函数采用什么值,那么答案是它需要输入字符串进行比较。在此处的 javadoc 中指定http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcompare%2Fcontentmergeviewer%2FTokenComparator.html

TokenComparator(String text) 为给定的字符串创建一个 TokenComparator。

你得到的空指针是因为在函数isCappingDisabled中它试图打开似乎为空的比较插件。您似乎缺少对插件“org.eclipse.compare.core”的直接依赖

于 2013-01-06T07:49:19.290 回答