Переименование пакетов в Eclipse
В Eclipse "Package Explorer", скажем, у меня есть список таких пакетов:
Если я хочу переименовать часть "com" в структуре пакета как "животное", я мог бы выбрать каждый пакет (выше) и выполнить рефакторинг > переименование.
Если у меня много пакетов, которые начинаются с "com" , этот процесс может занять некоторое время. Есть ли простой способ переименовать имя пакета "com" без индивидуального переименования каждого пакета в Проводнике пакетов? или удалить эти пакеты из пути сборки до переименования?
Я попытался перейти на панель "Навигатор", где он отображает папки в древовидной структуре, но мне не дают возможности переименования.
Ответы
Ответ 1
По умолчанию пустые родительские пакеты скрыты в проводнике пакетов, если вы измените Фильтры... в проводнике пакетов, чтобы снять флажок с Пустые родительские пакеты (третий сверху на втором снимке экрана), вы сможете увидеть пустые пакеты.
![package explorer filters]()
(источник: eclipse.org)
Затем вы можете переименовать com-пакет и выбрать опцию Rename subpackages, чтобы переименовать все дочерние пакеты.
(источник: 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
Затем просто переименуйте свои пакеты и установите флажок, если вы хотите, чтобы изменения каскадировались по иерархии.