如何在eclipse中以编程方式比较文件?

时间:2013-01-05 15:03:09

标签: eclipse eclipse-plugin

我正在开发一个eclipse插件,它针对文件的两个版本的差异运行代码违规检查程序。现在我使用diff.exe来获取两个文件之间的差异。但由于diff.exe是一个extrenal应用程序,我意识到使用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)中究竟要传递什么。 document表示此构造函数为给定的字符串创建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)

有人请说出正确的方法。

2 个答案:

答案 0 :(得分: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 中它尝试打开似乎为null的比较插件。你似乎错过了对插件的直接依赖&#34; org.eclipse.compare.core&#34;

答案 1 :(得分: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 可能是你的最佳选择(或者你可以切换到实现的 diff 的实现Java为了独立于平台)。
  2. 您不需要您的程序在独立环境中工作,仅作为Eclipse插件。在这种情况下,您可以保留您正在使用的代码。但是,当您运行代码时,必须将其作为新的“Eclipse应用程序”而不是“Java应用程序”启动。您可能希望查看有关如何为此开发Eclipse插件的教程,Lars Vogel的这个simple tutorial展示了如何运行新的Eclipse应用程序来测试Hello World插件。你需要一个类似的代码,一个菜单项可以在某处启动你的插件(右键单击一个文件,然后在你的情况下选择“检查违规”)。