访问Eclipse可部署插件中的资源

访问Eclipse可部署插件中的资源,eclipse,plugins,resources,Eclipse,Plugins,Resources,我正在开发一个Eclipse插件。 在我的插件中,我有以下代码: Bundle bundle = Platform.getBundle("org.eclipse.acceleo.EcoreDiff2EDelta"); URL fileURL = bundle.getEntry("src/metamodel/EcoreDiff.ecore"); String uri = null; try { uri = FileLocator.resolve(fileURL).getFile()

我正在开发一个Eclipse插件。 在我的插件中,我有以下代码:

Bundle bundle = Platform.getBundle("org.eclipse.acceleo.EcoreDiff2EDelta");
URL fileURL = bundle.getEntry("src/metamodel/EcoreDiff.ecore");
String uri = null;
try {
        uri = FileLocator.resolve(fileURL).getFile();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    Resource resource = resourceSet.getResource(URI.createURI(uri), true);
这段代码访问一个资源(EcoreDiff.ecore),它位于我的插件中的src/metamodel文件夹中。 当我通过右键单击项目文件夹->运行方式->eclipse应用程序来运行插件时,一切正常。 但如果我将插件导出为“可部署插件和片段” 我得到了下面的堆栈跟踪,这基本上意味着它找不到EcoreDiff.ecore文件。 我两天来一直在努力解决这个问题,我不知道出了什么问题

java.lang.reflect.InvocationTargetException
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421)
at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
at org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog.run(ProgressMonitorJobsDialog.java:275)
at org.eclipse.ui.internal.progress.ProgressManager$3.run(ProgressManager.java:960)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.progress.ProgressManager.busyCursorWhile(ProgressManager.java:995)
at org.eclipse.ui.internal.progress.ProgressManager.busyCursorWhile(ProgressManager.java:970)
at org.eclipse.ui.internal.progress.ProgressManager.run(ProgressManager.java:1166)
at org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupMenus.AcceleoGenerateEcoreDiff2EDeltaAction.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:91)
at org.eclipse.ui.actions.ActionDelegate.runWithEvent(ActionDelegate.java:70)
at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:241)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1022)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:916)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:585)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:540)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
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:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
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:629)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
Caused by: java.lang.NullPointerException
at org.eclipse.core.internal.runtime.Activator.getURLConverter(Activator.java:321)
at org.eclipse.core.runtime.FileLocator.resolve(FileLocator.java:227)
at org.eclipse.acceleo.EcoreDiff2EDelta.main.Generate.registerPackages(Generate.java:359)
at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.initialize(AbstractAcceleoGenerator.java:422)
at org.eclipse.acceleo.EcoreDiff2EDelta.main.Generate.<init>(Generate.java:97)
at org.eclipse.acceleo.EcoreDiff2EDelta.ui.common.GenerateAll.doGenerate(GenerateAll.java:90)
at org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupMenus.AcceleoGenerateEcoreDiff2EDeltaAction$1.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:76)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Root exception:
java.lang.NullPointerException
at org.eclipse.core.internal.runtime.Activator.getURLConverter(Activator.java:321)
at org.eclipse.core.runtime.FileLocator.resolve(FileLocator.java:227)
at org.eclipse.acceleo.EcoreDiff2EDelta.main.Generate.registerPackages(Generate.java:359)
at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.initialize(AbstractAcceleoGenerator.java:422)
at org.eclipse.acceleo.EcoreDiff2EDelta.main.Generate.<init>(Generate.java:97)
at org.eclipse.acceleo.EcoreDiff2EDelta.ui.common.GenerateAll.doGenerate(GenerateAll.java:90)
at org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupMenus.AcceleoGenerateEcoreDiff2EDeltaAction$1.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:76)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
java.lang.reflect.InvocationTargetException
位于org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421)
位于org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
位于org.eclipse.ui.internal.ProgressMonitorJobsDialog.run(ProgressMonitorJobsDialog.java:275)
位于org.eclipse.ui.internal.ProgressManager$3.run(ProgressManager.java:960)
位于org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
位于org.eclipse.ui.internal.ProgressManager.busyCursorWhile(ProgressManager.java:995)
位于org.eclipse.ui.internal.ProgressManager.busyCursorWhile(ProgressManager.java:970)
位于org.eclipse.ui.internal.progress.ProgressManager.run(ProgressManager.java:1166)
在org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupmones.AcceleoGenerateEcoreDiff2EDeltaAction.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:91)
位于org.eclipse.ui.actions.ActionDelegate.runWithEvent(ActionDelegate.java:70)
位于org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:241)
位于org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
访问org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
位于org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
位于org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
位于org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
位于org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
在org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)上
位于org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1022)
位于org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
位于org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:916)
位于org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
位于org.eclipse.ui.internal.Workbench$5.run(Workbench.java:585)
位于org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
位于org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:540)
位于org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
位于org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
在org.eclipse.equinox.internal.app.eclipseeapphandle.run上(eclipseeapphandle.java:196)
位于org.eclipse.core.runtime.internal.adapter.eclipseeappluncher.runApplication(eclipseeappluncher.java:110)
位于org.eclipse.core.runtime.internal.adapter.eclipseeappluncher.start(eclipseeappluncher.java:79)
位于org.eclipse.core.runtime.adapter.EclipseStarter.run(EclipseStarter.java:353)
位于org.eclipse.core.runtime.adapter.EclipseStarter.run(EclipseStarter.java:180)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
位于org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
位于org.eclipse.equinox.launcher.Main.run(Main.java:1438)
位于org.eclipse.equinox.launcher.Main.Main(Main.java:1414)
原因:java.lang.NullPointerException
位于org.eclipse.core.internal.runtime.Activator.getURLConverter(Activator.java:321)
位于org.eclipse.core.runtime.FileLocator.resolve(FileLocator.java:227)
位于org.eclipse.acceleo.ecorediff2edta.main.Generate.registerPackages(Generate.java:359)
位于org.eclipse.acceleo.engine.service.AbstractAcceleGenerator.initialize(AbstractAcceleGenerator.java:422)
位于org.eclipse.acceleo.ecorediff2edta.main.Generate。(Generate.java:97)
位于org.eclipse.acceleo.ecorediff2edta.ui.common.GenerateAll.doGenerate(GenerateAll.java:90)
在org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupmones.AcceleoGenerateEcoreDiff2EDeltaAction$1.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:76)
位于org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
根异常:
java.lang.NullPointerException
位于org.eclipse.core.internal.runtime.Activator.getURLConverter(Activator.java:321)
位于org.eclipse.core.runtime.FileLocator.resolve(FileLocator.java:227)
位于org.eclipse.acceleo.ecorediff2edta.main.Generate.registerPackages(Generate.java:359)
位于org.eclipse.acceleo.engine.service.AbstractAcceleGenerator.initialize(AbstractAcceleGenerator.java:422)
位于org.eclipse.acceleo.ecorediff2edta.main.Generate。(Generate.java:97)
位于org.eclipse.acceleo.ecorediff2edta.ui.common.GenerateAll.doGenerate(GenerateAll.java:90)
在org.eclipse.acceleo.EcoreDiff2EDelta.ui.popupmones.AcceleoGenerateEcoreDiff2EDeltaAction$1.run(AcceleoGenerateEcoreDiff2EDeltaAction.java:76)
位于org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
在部署的插件中,“元模型”应该是jar根目录中的一个文件夹,如果它是在build.properties中指定的。如果你往罐子里看,它在那儿吗

然后尝试:

URL url = bundle.getEntry("metamodel/EcoreDiff.ecore");
URL fileURL = org.eclipse.core.runtime.FileLocator.toFileURL(URL);

谢谢你,我把文件放在我的罐子里了,但是下面的说明起作用了!