我正在开发一个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)
有人请说出正确的方法。
答案 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 类就足以启动它了。
答案将是一个选择: