Переименование пакетов в Eclipse - PullRequest
31 голосов
/ 31 августа 2009

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

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

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

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

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

Ответы [ 5 ]

55 голосов
/ 08 сентября 2009

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

package explorer filters

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

Затем можно переименовать пакет com и проверить параметр Переименовать подпакеты , чтобы принудительно переименовать все дочерние пакеты.

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

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

6 голосов
/ 31 августа 2009

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

См:

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

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

Так что в данный момент это «задумано» (затмение 3.5), но улучшение зарегистрировано и будет учтено в 3.6.

Примечание: этот "недостаток" отмечается с 2005 года!

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

4 голосов
/ 31 августа 2009

Создайте файл в вашем пакете 'com'.Переименуйте его и отметьте «Переименовать подпакеты».Удалить файл.

3 голосов
/ 09 сентября 2009

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

Вот плагин.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
0 голосов
/ 12 декабря 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...