2009-08-31 6 views
30

В Затмения "Package Explorer", скажем, у меня есть список пакетов, как это:Переименование пакетов в Затмении

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

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

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

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

+0

Ознакомьтесь с ответом Рича (http://stackoverflow.com/questions/1355818/renaming-packages-in-eclipse/1393499#1393499): если это сработает для вас, вы можете установить его как официальный. – VonC

ответ

54

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

package explorer filters

filters view http://archive.eclipse.org/eclipse/downloads/drops/R-2.1-200303272130/images/non-shared-project-filter.gif

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

rename package http://archive.eclipse.org/eclipse/downloads/drops/R-3.2-200606291905/new_noteworthy/images/hierarchical_package_rename.png

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

+0

Хороший улов, Rich. +1. Может быть, ваш ответ должен быть официальным. – VonC

+0

Что? На самом деле я не сделал этого? Сожалею. Я действительно хотел. Ну, лучше поздно, чем никогда ...;) – VonC

+0

Ты очень добрый. Сразу после того, как я натолкнулся на лимит репрессий на сегодня, естественно –

6

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

См:

Когда рефакторинга пакет, который имеет подпакеты, JDT создает дочерние пакеты снова, вместо того, чтобы просто переименовав PAREN т

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

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

Примечание: «Отсутствие возможности» было отмечено с 2005 года!

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

4

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

+0

Спасибо за вопрос о «переименовании подпакетов» - это помогло мне разобраться, почему решение, предложенное Andy и MatrixFrog, не совсем сработало для меня (мой плохой) – digiarnie

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 
+0

И ... +1. На этот раз он должен * засчитывать в ваш дневной лимит;) – VonC

+0

большое спасибо, теперь просто нужно еще 562 –

0

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

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

Смежные вопросы