Подтвердить что ты не робот

Переименование пакетов в Eclipse

В Eclipse "Package Explorer", скажем, у меня есть список таких пакетов:

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

Если я хочу переименовать часть "com" ​​в структуре пакета как "животное", я мог бы выбрать каждый пакет (выше) и выполнить рефакторинг > переименование.

Если у меня много пакетов, которые начинаются с "com" , этот процесс может занять некоторое время. Есть ли простой способ переименовать имя пакета "com" ​​без индивидуального переименования каждого пакета в Проводнике пакетов? или удалить эти пакеты из пути сборки до переименования?

Я попытался перейти на панель "Навигатор", где он отображает папки в древовидной структуре, но мне не дают возможности переименования.

4b9b3361

Ответ 1

По умолчанию пустые родительские пакеты скрыты в проводнике пакетов, если вы измените Фильтры... в проводнике пакетов, чтобы снять флажок с Пустые родительские пакеты (третий сверху на втором снимке экрана), вы сможете увидеть пустые пакеты.

package explorer filters

filters view
(источник: eclipse.org)

Затем вы можете переименовать com-пакет и выбрать опцию Rename subpackages, чтобы переименовать все дочерние пакеты.

rename package
(источник: eclipse.org)

Затем, когда вы закончите, повторно примените фильтр, чтобы снова скрыть все эти пустые пакеты.

Ответ 2

Похоже, что текущий JDT API (Java Development Tool, часть, которая включает переименование пакетов) делает только переименование одного пакета за раз (а не подпакеты)

См:

При реорганизации пакета, который имеет подпакеты, JDT создает дочерние пакеты снова, вместо простого переименования родительского

нам нужен API на IPackageFragment, чтобы переименовать не только фрагмент, но также и все подпакеты.
Фактически, реализация переименовала бы папку фрагмента пакета, а затем обновила объявления пакетов во всех содержащихся в нем CU (в том числе в подпакетах).

Итак, он "по дизайну" в момент времени (eclipse 3.5), но улучшенное значение регистрируется и будет учтено для 3.6.

Примечание. "Отсутствие функции" было отмечено с 2005 года!

Я тестировал новое иерархическое переименование пакетов и имел две исходные папки с той же структурой упаковки. Чтобы переименовать пакеты, я должен был сделать то же самое дважды. Было бы неплохо получить подсказку и спросить, следует ли переименовывать пакет также применяются к другим исходным папкам.

Ответ 3

Создайте файл в своем пакете "com". Переименуйте его и установите флажок "Переименовать подпакеты". Удалите файл.

Ответ 4

У меня есть желание внедрить плагин для переименования родительских пакетов. Он добавляет элемент "Переименовать родительский пакет" в контекстное меню или может быть запущен с помощью 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

Ответ 5

Умм, я не знаю, что делают все остальные, но в Eclipse Juno щелкните правой кнопкой мыши packacge → refactor → rename

Затем просто переименуйте свои пакеты и установите флажок, если вы хотите, чтобы изменения каскадировались по иерархии.