0

ファイルの 2 つのバージョンの違いに対してコード違反チェッカーを実行する Eclipse プラグインを開発しています。現在、 diff.exeを使用して 2 つのファイルの違いを取得しています。しかし、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. コードをスタンドアロン Java プログラムとして Eclipse から実行する必要があります。このような場合、org.eclipse.compare は使用できず、diff.exeがおそらく最良の選択です (または、プラットフォームに依存しないようにするために、Java で実装されたdiffの実装に切り替えることができます)。
  2. プログラムをスタンドアロン環境で動作させる必要はなく、Eclipse プラグインとしてのみ動作します。この場合、使用しているコードを保持できます。ただし、コードを実行するときは、「Java アプリケーション」ではなく、新しい「Eclipse アプリケーション」として起動する必要があります。このための 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 を作成します。

そして、あなたが取得しているnullポインタは、関数isCappingDisabledでnullのように見える比較プラグインを開こうとするためです。プラグイン「org.eclipse.compare.core」への直接的な依存関係がないようです

于 2013-01-06T07:49:19.290 に答える