无法在 Eclipse 中重构重命名

Posted

技术标签:

【中文标题】无法在 Eclipse 中重构重命名【英文标题】:Can't refactor rename in Eclipse 【发布时间】:2012-07-07 22:50:29 【问题描述】:

如果我对某些东西进行重构重命名,它会尝试做一会儿,然后将其恢复为之前的名称。不会显示任何错误或任何表明有问题的迹象。


我刚刚重新启动了 Eclipse,现在情况更糟了。之前,至少选择 Refactor > Rename 会将名称“装箱”并假装它允许您进行重构。现在,重启后,选择 Refactor > Rename 什么都不做。

Win7 64位 Eclipse Indigo 内部版本 20110615-0604

【问题讨论】:

你的观点是?你要重命名什么,改成什么?如果您确实需要一些帮助,您只需提供更多信息...... 还要验证项目是否有任何编译错误。有时会出现编译错误,它不会让你重构东西。 这发生在我尝试重命名 javascript 方法时。 JSDT 已安装。删除和添加项目没有帮助。 更新:请注意,直到 2020-09 的较新版本的 Eclipse 存在触发此错误的错误,请更新您的 Eclipse 并查看 this Q/A 了解详细信息。并且不要忘记投票。当然,不管崩溃,它都不应该打开“运行...”。 【参考方案1】:

对我有用的快速解决方法:

将 static 修饰符添加到您的方法签名中(通过对所有引用进行即时编译来“强制”编译错误) 重构方法名称(错误仍然存​​在) 删除静态修饰符(使用更改的方法签名重新编译,错误消失...)

【讨论】:

【参考方案2】:

我也一直在努力解决这个问题。当我查看 Eclipse 的错误日志视图时,我注意到每次尝试重命名变量或方法时,都会遇到这种异常:

java.lang.reflect.InvocationTargetException at 
org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421) at 
org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:759) at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) at 
org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:756) at
org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2606) at 
org.eclipse.jdt.internal.ui.refactoring.RefactoringExecutionHelper.perform(RefactoringExecutionHelper.java:191) at
org.eclipse.jdt.internal.ui.refactoring.RefactoringExecutionHelper.perform(RefactoringExecutionHelper.java:151) at
org.eclipse.jdt.ui.refactoring.RenameSupport.perform(RenameSupport.java:197) at
org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLinkedMode.doRename(RenameLinkedMode.java:361) at
org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLinkedMode$EditorSynchronizer.left(RenameLinkedMode.java:119) at 
org.eclipse.jface.text.link.LinkedModeModel.exit(LinkedModeModel.java:341) at 
org.eclipse.jface.text.link.LinkedModeUI$4.run(LinkedModeUI.java:1194) 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:4041) at 
org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)

我注意到这一切都是从 SWT 库开始的。尝试更新 SWT,但由于某些原因,我什至无法找到已安装的 SWT。 所以我只是通过帮助安装了 SWT 工具 3.106.0.v20170503-0851 -> 安装新软件,很高兴地解决了这个问题。

【讨论】:

欢迎来到 ***!我不清楚您的答案是否与所提出的问题相符。如果是这样,您能否使连接更明确?谢谢。 您可以从此处获取要在帮助 > Install_New_Software 中使用的站点 URL:eclipse.org/swt/updatesite.php - 我使用了里程碑更新站点:download.eclipse.org/eclipse/updates/milestones @EllenSpertus 它确实符合问题并为我解决了问题。此堆栈跟踪来自 eclipse 中的错误日志窗口。当使用更改签名或重构>重命名,单击选项时,它会报告错误并告诉您查看错误日志(没有对话框的简单重命名只会执行一段时间,然后恢复我的更改并且不报告任何内容)。此堆栈跟踪显示特定的重命名操作异常。您可以判断堆栈跟踪是否匹配,因为其中包含 RefactoringExecutionHelper 和 RenameLinkedMode.doRename。 好的,在这解决了我的问题之后,我重命名了几个方法并再次得到同样的错误。重新启动 Eclipse 修复它。请注意,我还必须在安装 SWT 后第一次重新启动 Eclipse。【参考方案3】:

尝试以下方法(对我有用):

    删除项目 新建一个同名的java项目

【讨论】:

【参考方案4】:

有同样的问题:

左键单击java类中的属性名 右键单击 重构 重命名 重命名 按回车 绿色进度条出现在页脚菜单上,但从未完成 要恢复我必须杀死 eclipse(你可以尝试退出,但保存工作台状态时它会挂起)

我在 Windows 上运行这个:

版本:Kepler Service Release 2 版本号:20140224-0627

我通过以下方式“修复”了该行为:

对文件进行小改动 保存文件 重试了重构,它运行良好(尽管在等待重构完成大约 5 秒时会出现令人不舒服的延迟)

项目中没有错误,挂起时日志中没有任何明显的内容,从工作区删除/重新导入项目也不起作用(并在重新导入之前删除 .classpath .project 和 .settings )。

【讨论】:

【参考方案5】:

虽然在极少数情况下直接在编辑器中重命名方法不起作用,然后 IDE 在按下返回键后恢复原始方法名称 - 一种“不可知模式”:-),但当我通过重构执行相同操作时 -> Change Methode Signature,在右上角我更改了方法名称,然后我收到一条非常详细的错误消息:“执行重构时发生意外异常......原因:匿名 #1 in . ... 在 lambda #1 ... 在 ... 工作副本 ... 不存在。”

这表明,重命名方法会触发此失败,当要重命名的方法在 lambda 或匿名类的上下文中使用时

要检查,注释掉 lambda 或匿名类中的出现,重构/重命名可以像我的情况一样按预期工作。

【讨论】:

【参考方案6】:

我想在这里为其他一些答案添加一些信息。

Archenoth's answer 指出您可以通过运行“预览”来获得更多关于重命名操作的信息。我花了一段时间才弄清楚如何进行预览:再次键入重命名键以获取对话框。有时预览没有给出错误信息(没有 ppoup 的快速重命名也没有),但在对话框中单击“确定”确实说明了更多信息。

MutantXenu 通过进入工作区中的文件在日志中找到信息,但您也可以通过进入错误日志视图(来自 Cmd-3)在 Eclipse 中获取这些信息

当我遇到这个问题时,错误日志将我指向这个失败的断言:“搜索方法声明没有找到原始元素”,这导致了一些未解决的错误。 (我正在运行 Kepler,但这个问题显然很难复制,而且我没有看到它已解决的证据。请参阅 here 和 here。)

您可以通过选择方法并使用 Cmd-G(或 Ctrl-G:搜索 > 声明 > 工作区)来查看您是否遇到此特定错误。 Eclipse 无法找到您尝试重命名的方法,并且搜索结果为空。

我的情况表明错误可能与不同类中的同名方法有关。当一个方法出现问题时,它不会影响大多数其他方法。

刷新、Project->Clean 和重新启动 Eclipse 对我没有帮助。 Kevin's answer 为我工作:“尝试从 Eclipse 中删除项目(不要删除磁盘上的项目内容),然后重新加载。”

【讨论】:

【参考方案7】:

如果某些不太明显的事情导致重构失败,您可以通过尝试预览重构而不是尝试执行重构来查找问题。

正如 Dicky Moore 所提到的,您不能在项目中出现错误进行重构...但这些并不总是 Eclipse 标记的代码错误或构建路径问题。所以有时它看起来好像没有任何错误,但它仍然会失败。如上所述,“预览”将在错误对话框中显示这些问题,即使它们从未出现在其他地方。

从那里,您可以配置您的项目以修复错误(一个常见的问题是重构尝试解释它不应该考虑的输出文件夹,这可以通过在您的 Build Path > Source 设置中排除文件夹来修复.) 或卸载有问题的插件。

【讨论】:

【参考方案8】:

在 4.4 (Luna) 中,我在大型重构后遇到了跨项目重构问题 - 删除 /.metadata/.plugins/org.eclipse.jdt.core 文件夹为我修复了这个问题

【讨论】:

【参考方案9】:

如果您的项目中有任何错误,重构将不起作用。

修复错误,或者只是注释掉被检测为错误的部分,以便运行重构。

这对我有用。

【讨论】:

【参考方案10】:

Eclipse Helios 有这个问题。我查看了工作区的 .metadata 目录并打开了 .log 文件。它有很长的与错误相关的引用链,但其中的相关部分是:

java.lang.NoClassDefFoundError: org/eclipse/jdt/core/IMethod

java.lang.reflect.InvocationTargetException 在 org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421) 在 org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:759) 在 org.eclipse.swt.custom.BusyIndi​​cator.showWhile(BusyIndi​​cator.java:70) 在 org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:756) 在 org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2606) 在 org.eclipse.jdt.internal.ui.refactoring.RefactoringExecutionHelper.perform(RefactoringExecutionHelper.java:191) 在 org.eclipse.jdt.internal.ui.refactoring.RefactoringExecutionHelper.perform(RefactoringExecutionHelper.java:151) 在 org.eclipse.jdt.ui.refactoring.RenameSupport.perform(RenameSupport.java:197) 在 org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLinkedMode.doRename(RenameLinkedMode.java:361) 在 org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLinkedMode$EditorSynchronizer.left(RenameLinkedMode.java:119) 在 org.eclipse.jface.text.link.LinkedModeModel.exit(LinkedModeModel.java:341) 在 org.eclipse.jface.text.link.LinkedModeUI$4.run(LinkedModeUI.java:1194) 在 org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 在 org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134) 在 org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)

我去了 Help > Install New Software > What is already installed,然后选择了与 org.eclipse.swt 和点击卸载。重启 Eclipse 后,问题消失了,我又可以正常重构/重命名了。

【讨论】:

开普勒也一样【参考方案11】:

当我尝试重命名两个变量和方法名称时,我看到了与 OP 完全相同的问题。重启 Eclipse 后,Refactor->Rename 功能正常工作。

【讨论】:

【参考方案12】:

尝试从 Eclipse 中删除项目(不要删除磁盘上的项目内容),然后重新加载。

【讨论】:

8年过去了,还是一样的废话。

以上是关于无法在 Eclipse 中重构重命名的主要内容,如果未能解决你的问题,请参考以下文章

从Eclipse插件重命名项目

Eclipse 重构

使用Wing IDE重命名对象

eclipse 工作区:如何重命名工作区

尝试在 XCode 4.1 中重构重命名时出错

重命名应用程序包生成致命错误“执行重构时发生致命错误”