2

Eclipse 3.6.1 でソース コードを調べるプラグイン (ClassRefactoringPlugin) を作成しています。このプラグインには、Java ソース ファイルを調べて、JDT 操作を使用してメソッドから呼び出される Java 要素を特定する CallData クラスが含まれています。ClassRefactoringPlugin プロジェクトにも存在するこのクラスの JUnit 4 テストを作成しました。JUnit プラグイン テストとして実行したところ、次の結果が得られました。

Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]

私は何を間違えましたか?構成では、すべてのワークスペースと有効なターゲット プラグインで起動するように指定されており、ClassRefactoringPlugin はドロップイン ディレクトリにあります。(プロジェクトのバージョンのプラグインは、生成されたワークスペースによって認識されるべきではありませんか?)

スタック トレースは次のとおりです。

!MESSAGE CallData.calculateCalledMethods: Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]
Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]
        at org.eclipse.jdt.internal.core.JavaElement.newJavaModelException(JavaElement.java:502)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:246)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.CompilationUnit.openAncestors(CompilationUnit.java:1170)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.SourceRefElement.generateInfos(SourceRefElement.java:107)
        at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:515)
        at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:252)
        at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:238)
        at org.eclipse.jdt.internal.core.JavaElement.getChildren(JavaElement.java:193)
        at org.eclipse.jdt.internal.core.JavaElement.getChildrenOfType(JavaElement.java:207)
        at org.eclipse.jdt.internal.core.SourceType.getMethods(SourceType.java:403)
        at nz.ac.vuw.ecs.kcassell.utils.EclipseSearchUtils.addDesiredMethods(EclipseSearchUtils.java:333)
        at nz.ac.vuw.ecs.kcassell.utils.EclipseSearchUtils.getMethods(EclipseSearchUtils.java:210)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.collectMethodCallData(CallData.java:203)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.calculateCalledMethods(CallData.java:176)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.collectCallData(CallData.java:151)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallDataTest.testCollectCallData(CallDataTest.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:232)
        at junit.framework.TestSuite.run(TestSuite.java:227)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
        at org.eclipse.pde.internal.junit.runtime.UITestApplication$1.run(UITestApplication.java:116)
        at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
        at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
        at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3515)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3164)
        at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
        at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
        at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
        at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
        at org.eclipse.pde.internal.junit.runtime.UITestApplication.start(UITestApplication.java:47)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1383)

エラーメッセージが赤いニシンではないかと思っています。に電話をかけるとエラーが発生します IMethod[] methods = type.getMethods();

そこにブレークポイントを設定しtype、デバッガーの変数ビューを見ると、次のように表示されます。

CallDataTest (not open) [in CallDataTest.java [in nz.ac.vuw.ecs.kcassell.callgraph [in test [in ClassRefactoringPlugin]]]]

プロジェクトを検討できるようにするための重要な準備段階を省略しているのではないかと思います。まず、次のようにワークベンチをアクティブにしようとします。

public static void activateWorkbench() {
    // possible for PlatformUI.getWorkbench to throw an IllegalStateException
    // if the workbench is not yet started e.g createAndRunWorkbench() has not yet been called
    IWorkbench workbench = PlatformUI.getWorkbench();
    IWorkbenchWindow workbenchWindow =
        workbench.getActiveWorkbenchWindow();
    workbenchWindow.getActivePage();
}

次に、ハンドルを使用して型を取得しようとします。

protected IType iType = EclipseUtils.getTypeFromHandle(
        "=ClassRefactoringPlugin/test<nz.ac.vuw.ecs.kcassell.callgraph{CallDataTest.java[CallDataTest");

public static IType getTypeFromHandle(String handle) {
IType type = null;
IJavaElement element = JavaCore.create(handle);
if (element == null) {
    System.err.println("  No element created from " + handle);
} else if (element instanceof IType) {
    type = (IType) element;
}
    return type;
}

私はプラグイン開発に不慣れなので、どんな助けでも大歓迎です。

乾杯、 キース

4

2 に答える 2

1

ここで何をしようとしているのか正確には少しわかりませんが、プラグインの JUnit テストを作成しようとしているようです。これは正しいですか?

作成している Java 要素ハンドル ID によると、ClassRefactoringPluginワークスペースにはプロジェクトが呼び出され、そこには test というソース フォルダーとCallDataTest、パッケージ内で呼び出される Java クラスが存在するはずnz.ac.vuw.ecs.kcassell.callgraphです。

これは当てはまらず、作成したばかりのプラグインでクラス ファイルを参照する必要があると思います。

その前に、プロジェクトをテスト ワークスペースにインポートし、そのクラスパスを設定する必要があります。その後、ハンドル識別子を使用してその内容にアクセスできます。

何をしようとしているのか誤解しているかもしれませんが、ワークスペースに存在しない Java ファイルにアクセスしようとしているようです。これがあなたのやりたいことであることが確認できれば、まさにあなたが望んでいることを実行するテスト コードをいくつか紹介できます。


まさにこれを行うオープン ソース プロジェクトがいくつかあり、目的に合わせてソース コードの一部を借りることができます。私がよく知っているプロジェクトは、Groovy-Eclipse http://groovy.codehaus.org/Eclipse+Plugin (私がそのプロジェクトのリーダーであるため) です。

テスト プロジェクトの作成と管理に使用するクラスへのリンクは次のとおりです。

https://svn.codehaus.org/groovy/eclipse/trunk/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/TestProject.java

このコードの一部またはすべてを独自のテストに使用できます。各テストの最後にすべてのプロジェクトを削除することを忘れないでください。

于 2011-04-19T03:56:56.953 に答える
0

さまざまな理由で同様のエラーが発生しました。プロジェクトでターゲット パッケージの名前を変更した後にエラーが発生しました。paskster の解決策を試してもうまくいかなかったので、掘り下げ始めました。

実際の問題は、マニフェスト ファイルからのパッケージ名の名前変更が期待どおりに機能しないことでした。どこでもすべてが変わると思いました。ただし、古いパッケージ名は、テスト ディレクトリのマニフェスト ファイルと、リソースの一部のビューに残っていました。それらの名前を手動で変更してプロジェクトを再構築した後、エラーはなくなりました。

これは、別の質問に対する受け入れられた回答です: Java Model Exception: Java Model Status [gen [in MyApp] does not exist] after Eclipse Android project Clean

この質問の所有者は、この質問へのリンクを含む解決策としてこの回答に賛成票を投じたので、ここにも投稿すると思いました。

于 2011-04-17T11:14:41.970 に答える