在Eclipse中重命名包

时间:2009-08-31 04:42:59

标签: java eclipse refactoring

在Eclipse的“Package Explorer”中,假设我有一个这样的包列表:

  • com.dog
  • com.cat
  • com.frog

如果我想将包结构的“com”部分重命名为“animal”,那么我可以选择每个包(上面)并执行重构>重命名。

如果我有许多以“com”开头的软件包,那么这个过程可能需要一段时间。是否有一种简单的方法来重命名“com”包名称,而无需在Package Explorer中单独重命名每个包?或者在重命名之前从构建路径中删除这些包?

我尝试进入“导航器”窗格,在窗格中显示树状结构中的文件夹,但我没有给予重命名功能。

5 个答案:

答案 0 :(得分:55)

默认情况下,如果您在软件包资源管理器中修改过滤器... 以取消选中清空父软件包,则默认情况下会在软件包资源管理器中隐藏空父软件包(排名第三)在第二个屏幕截图中)你将能够看到空包。

package explorer filters

filters view
(来源:eclipse.org

然后,您可以重命名 com 包并检查重命名子包选项以强制重命名所有子包。

rename package
(来源:eclipse.org

然后,当您完成重新应用过滤器以再次隐藏所有这些空包时。

答案 1 :(得分:6)

看起来当前的JDT API(Java开发工具,包含包重命名的部分)一次只重命名一个包(而不是子包)

请参阅:

  

当重构具有子包的包时,JDT会创建子包   再次,而不是只重命名父

  

我们需要IPackageFragment上的API才能重命名   片段,但也包括所有子包   实际上,实现将重命名包片段的文件夹,然后更新所有包含的CU(包括子包中的CU)中的包声明

所以当时是“按设计”(eclipse 3.5),但会记录增强功能并将其考虑在内。

注意:自2005年以来一直注意到“缺乏功能”!

  

我正在测试新的分层包重命名,并有两个源文件夹   具有相同的包结构。要在两者中重命名包,我必须这样做   操作两次。
  得到一个提示并被问及包重命名是否应该是很好的   也应用于其他源文件夹。

答案 2 :(得分:4)

在'com'包中创建一个文件。重命名并选中“重命名子包”。删除文件。

答案 3 :(得分:3)

我已经实现了一个重命名父包的插件。它将“重命名父包”项添加到上下文菜单中,或者可以由 ctrl-7 触发。

我没有实现代码来根据活动选择启用/禁用菜单项(有一些竞争条件会导致向导停止取消)。如果活动选择是包含父包的包,则它将选择该父包并启动重命名向导。您仍然需要手动选择“重命名子包”。

这是插件代码:

package name.seller.rich.packagerenamer.actions;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
import org.eclipse.jdt.ui.actions.RenameAction;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.handlers.HandlerUtil;

public class RenameParentPackageHandler extends AbstractHandler {

    public RenameParentPackageHandler() {
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
        try {
            IStructuredSelection selection = SelectionConverter
                    .getStructuredSelection(activePart);

            IPackageFragment parentPackage = getParentPackage(selection);

            if (parentPackage != null && parentPackage.exists()) {

                RenameAction action = new RenameAction(HandlerUtil
                        .getActiveSite(event));

                StructuredSelection parentSelection = new StructuredSelection(
                        parentPackage);
                action.run(parentSelection);
            }
        } catch (JavaModelException e) {
            logException(e);
        }
        return null;
    }

    private IPackageFragment getParentPackage(IStructuredSelection selection) {
        IJavaElement[] elements = SelectionConverter.getElements(selection);

        if (elements != null && elements.length > 0) {
            if (elements[0] != null && elements[0] instanceof IPackageFragment) {
                IPackageFragment fragment = (IPackageFragment) elements[0];

                String packageName = fragment.getElementName();
                int lastDotIndex = packageName.lastIndexOf(".");

                if (lastDotIndex != -1) {
                    String parentPackageName = packageName.substring(0,
                            lastDotIndex);

                    IJavaElement parent = fragment.getParent();
                    if (parent != null
                            && parent instanceof IPackageFragmentRoot) {

                        return ((IPackageFragmentRoot) parent)
                                .getPackageFragment(parentPackageName);

                    }
                }
            }
        }
        return null;
    }

    protected void logException(Exception e) {
        JavaPlugin.log(e);
    }
}

这是plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
   <extension
     point="org.eclipse.ui.commands">
      <command
        name="Rename parent package"
        categoryId="name.seller.rich.packagerenamer.category"
        id="name.seller.rich.packagerenamer.renameParentPackage">
      </command>
   </extension>
   <extension
     point="org.eclipse.ui.handlers">
      <handler
        commandId="name.seller.rich.packagerenamer.renameParentPackage"
        class="name.seller.rich.packagerenamer.actions.RenameParentPackageHandler">
      </handler>
   </extension>
   <extension
     point="org.eclipse.ui.bindings">
      <key
        commandId="name.seller.rich.packagerenamer.renameParentPackage"
        contextId="org.eclipse.ui.contexts.window"
        sequence="M1+7"
        schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
      </key>
   </extension>
   <extension
     point="org.eclipse.ui.menus">
      <menuContribution
        locationURI="popup:org.eclipse.ui.popup.any?after=additions">
         <command
           commandId="name.seller.rich.packagerenamer.renameParentPackage"
           mnemonic="K">
         </command>
      </menuContribution>
   </extension>
</plugin>

清单:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Classwizard
Bundle-SymbolicName: name.seller.rich.packagerenamer; singleton:=true
Bundle-Version: 1.0.0
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.jdt.core;bundle-version="3.5.0",
 org.eclipse.core.expressions;bundle-version="3.4.100",
 org.eclipse.jface.text;bundle-version="3.5.0",
 org.eclipse.jdt.ui;bundle-version="3.5.0",
 org.eclipse.ui.ide;bundle-version="3.5.0",
 org.eclipse.ui.editors;bundle-version="3.5.0",
 org.eclipse.core.resources;bundle-version="3.5.0"
Eclipse-AutoStart: true
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

答案 4 :(得分:0)

嗯,我不知道其他人在做什么,但是在Eclipse Juno中右键单击packacge - &gt;重构 - &gt;重命名

然后只需重命名您的包,如果您希望更改级联层次结构,请选中此框。