2013-01-05 55 views
0

我正在开发一个eclipse插件,用于对文件的两个版本的区别运行代码违例检查器。现在我正在使用diff.exe来获取这两个文件之间的区别。但是,由于diff.exe是一个extrenal应用程序,我意识到最好使用eclipse内置比较工具来获取文件差异。 所以我用org.eclipse.compare最多时达到了这一点:如何在eclipse中以编程方式比较文件?

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(字符串)传递。 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) 

有人告诉什么是进行正确的方式。

回答

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”

+0

我在我的插件的Manifest.MF的依赖性选项卡中添加了org.eclipse.compare.core(3.5.200),但我仍然面临相同的NPE问题。我错过了什么吗? – Peeyush

+0

你是否将此作为eclipse RCP /插件运行? – codejammer

+0

请参阅评论Kellindil的答案。 – Peeyush

0

从来就不是该org.eclipse.compare插件在独立使用:它的许多功能需要一个Eclipse的运行实例。此外,它将核心代码和UI代码混合在同一个插件中,如果您对使用的内容以及您的环境中实际可用的依赖关系不太在意,会导致意外行为。

你提到你正在开发一个Eclipse插件。然而,你得到的NPE表明你没有将你的代码作为Eclipse插件运行,而是作为一个标准的Java程序运行。在Eclipse环境中,ComparePlugin.getDefault()不能返回:插件需要启动该调用返回什么,但 ....和ComparePlugin类在Eclipse中仅仅装载足以启动它。

答案将是一个选择:

  1. 你需要你的代码作为一个独立的Java程序进行的Eclipse运行。在这种情况下,您不能使用org.eclipse.compare和diff.exe可能是您的最佳选择(或者您可以切换到实现在Java中以实现独立于平台的diff) 。
  2. 您不需要程序在独立环境中工作,只需要作为Eclipse插件。在这种情况下,您可以保留您正在使用的代码。但是,当您运行代码时,必须将其作为新的“Eclipse应用程序”而不是“Java应用程序”来启动。您可能想看看如何为此开发Eclipse插件的教程,来自Lars Vogel的simple tutorial展示了如何运行新的Eclipse应用程序来测试Hello World插件。你需要一个类似的代码,用菜单条目来启动你的插件(右键点击一个文件,然后在你的情况下选择“检查违规”)。
+0

Kellindil 感谢您解决这个问题,我故意在独立运行比较代码,以便快速查看行为。但是我忘了插件必须在eclipse环境中执行。傻我!当我将该插件作为Eclipse应用程序运行时,比较开始工作。 现在,随着问题的解决,我可以意识到RangeDifferencer.findDifferences不是比较2个文件的正确方法(请纠正我,如果我错了)。其实我正在寻找一个简单的方法,接受同一个文件的两个版本,并提供文件差异(像Patch对象)作为输出。 – Peeyush

+0

@Peeyush我依赖于org.eclipse.compare的API来做我自己的项目......但我并没有比较自己的“文本”文件,所以从来没有试图用这些API创建补丁。 “补丁”文件根据您比较的存储库(CVS,Git ...)而不同,存储库通常会提供自己的创建补丁操作。如果你想要的只是两个本地文件之间的常规“差异”格式补丁,org.eclipse.compare.patch包(特别是PatchBuilder)可能是你需要的吗?你应该改变这个问题“在Eclipse中有'diff'功能”虽然:)。 – Kellindil

相关问题