2016-09-15 106 views
3

对于大型的Java/Maven项目,我有一个新的Emacs设置(在Windows上)。company-emacs-eclim在项目中使用了错误的路径

安装了Eclipse和eclim(java层更新为最新版本的spacemacs,作为额外软件包安装的company-emacs-eclim),但是当company-emacs-eclim尝试自动完成时,它使用错误的文件路径插入该项目文件夹两次,例如

X:/EclipseWorkspace/Project/Project/src/main/com/company/product/Klass.java 

,而不是

X:/EclipseWorkspace/Project/src/main/com/company/product/Klass.java 

错误消息

Company: An error occurred in auto-begin 
Company: backend company-emacs-eclim error "Could not read from "file:///X:/EclipseWorkspace/Project/Project/src/main/com/company/product/Klass.java" because it is a not a file." with args (candidates this) 

在eclimd,我得到同样的消息的异常:

ERROR [org.eclim.command.Main] Command failed 
org.apache.commons.vfs.FileSystemException: Could not read from "file:///X:/EclipseWorkspace/Project/Project/src/main/com/company/product/Klass.java" because it is a not a file. 
at org.apache.commons.vfs.provider.AbstractFileObject.getInputStream(AbstractFileObject.java:1109) 
at org.apache.commons.vfs.provider.DefaultFileContent.getInputStream(DefaultFileContent.java:317) 
at org.eclim.util.file.FileUtils.byteOffsetToCharOffset(FileUtils.java:75) 
at org.eclim.plugin.core.command.AbstractCommand.getOffset(AbstractCommand.java:99) 
at org.eclim.plugin.core.command.AbstractCommand.getOffset(AbstractCommand.java:71) 
at org.eclim.plugin.core.command.complete.AbstractCodeCompleteCommand.execute(AbstractCodeCompleteCommand.java:60) 
at org.eclim.command.Main$1.run(Main.java:100) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4203) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3819) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) 
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) 
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:687) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:604) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 
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:673) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1519) 

我试着关闭并重新打开工作区在Emacs中打开项目,重新创建整个工作区,所有内容都可以得到相同的结果。

+0

你有没有解决这个问题?我看到同样的事情。 – glucas

回答

1

简短的回答似乎是eclim对多模块maven项目的不完全支持。见例如https://github.com/ervandew/eclim/issues/499

该问题与company无关,错误号码相同,请致电eclim-complete。似乎发生的情况是,多模块项目eclim--project-current-file被设置为相对于根而不是当前项目的路径。

您可以通过建议eclim--current-project-file返回正确的相对路径来解决此问题。例如:

(defun my-eclim-fix-relative-path (path) 
    (replace-regexp-in-string "^.*src/" "src/" path)) 

(advice-add 'eclim--project-current-file :filter-return #'my-eclim-fix-relative-path) 

这可能会影响其他eclim的行为,但在我的快速测试工作对我来说,当我工作的src/main和src /测试文件。

1

你检查了项目根目录下的.classpath文件的内容吗?不知何故,这可能包含一些错误。如果将其编辑为指向正确的目录,则可能会修复自动完成。

+0

.classpath没有被破坏,它指向正确的相对位置 –