2009-08-31 7 views
30

W "Package Explorer" Eclipse, powiedzmy, że mam listę pakietów takiego:pakiety Zmiana nazwy w Eclipse

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

Jeśli chcę zmienić nazwę części "com" struktury pakietu na "zwierzę", to mogę wybrać każdą paczkę (powyżej) i wykonać refaktor> zmienić nazwę.

Jeśli mam wiele pakietów rozpoczynających się od "com", proces ten może chwilę potrwać. Czy istnieje prosty sposób na zmianę nazwy pakietu "com" bez konieczności indywidualnej zmiany nazwy każdego pakietu w Eksploratorze pakietów? lub usunięcie tych pakietów ze ścieżki kompilacji przed zmianą nazwy?

Próbowałem przejść do okienka "Nawigator", gdzie wyświetlane są foldery w strukturze drzewa, ale nie mam możliwości zmiany nazwy.

+0

Sprawdź odpowiedź Richa (http://stackoverflow.com/questions/1355818/renaming-packages-in-eclipse/1393499#1393499): jeśli to działa, możesz ustawić ją jako oficjalną. – VonC

Odpowiedz

54

Domyślnie pustych opakowań macierzystych są ukryte w Eksploratorze pakietu, jeśli zmodyfikować Filtry ... w Eksploratorze Package odznaczyć puste opakowania Parent (trzeci od góry w drugim zrzucie) będziesz mógł aby zobaczyć puste pakiety.

package explorer filters

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

Można wtedy zmienić nazwę com pakiet i sprawdzić Rename podpakiety opcję, aby zmusić wszystkie pakiety potomne być zmieniona.

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

Wtedy kiedy skończysz ponownie zastosować filtr, aby ponownie ukryć te wszystkie puste opakowania.

+0

Dobry połów, Rich. +1. Być może Twoja odpowiedź powinna być oficjalna. – VonC

+0

Co? Właściwie to nie zrobiłem tego upomnienia? Przepraszam. Naprawdę chciałem. Cóż, lepiej późno niż wcale ...;) – VonC

+0

Jesteś bardzo miły. Zaraz po tym, jak w naturalny sposób uderzę w limit repa na dziś. –

6

Wygląda bieżącego JDT API (Java Development Tool, część, która zawiera pakiet renamming) nie zmieniać nazwy tylko jeden pakiet na raz (a nie sub-pakiety)

Patrz:

Kiedy refactoring pakiet, który ma podpakiety, JDT tworzy pakiety potomne znowu, zamiast po prostu zmiana nazwy pAREN t

musimy API na IPackageFragment zmiany nazwy nie tylko fragment ale także także wszystkie podpakiety.
Skutecznie, wdrożenie byłoby zmienić nazwę folderu fragmentu pakietu, a następnie zaktualizować deklaracji pakietu ze wszystkich zamkniętego CUS (włącznie podpakiety)

Więc to jest „projektem” przy ówczesnej chwili (eclipse 3.5), ale ulepszenie jest rejestrowane i będzie brane pod uwagę w 3.6.

Uwaga: ten "brak funkcji" odnotowano od 2005 roku!

I testuje nowej hierarchicznej pakietów przenoszenia, miał dwa katalogi źródłowych o takiej samej konstrukcji opakowania. Aby zmienić nazwy pakietów w obu musiałem dwukrotnie wykonać tę samą operację .
Byłoby miło uzyskać podpowiedź i zapytać, czy zmiana nazwy pakietu powinna być zastosowana również do innych folderów źródłowych.

4

Utwórz plik w pakiecie "com". Zmień nazwę i sprawdź "Zmień nazwę podpakietów". Usuń plik.

+0

Dzięki za punkt dotyczący "zmiany nazwy podpakietów" - pomogło mi to wyjaśnić, dlaczego rozwiązanie zaproponowane przez Andy'ego i MatrixFroga nie działa dla mnie (moje złe). – digiarnie

3

Wcześniej wprowadziłem wtyczkę do zmiany nazw pakietów nadrzędnych. Dodaje element "Zmień nazwę opakowania nadrzędnego" do menu kontekstowego lub może być wywoływany przez ctrl-7.

Nie zaimplementowałem kodu, aby włączyć/wyłączyć element menu na podstawie aktywnej selekcji (jest pewien stan wyścigu, który powoduje, że kreator przestaje anulować). Jeśli aktywna selekcja jest pakietem z pakietem nadrzędnym, wybierze tego rodzica i uruchomi kreatora zmiany nazwy. Nadal musisz wybrać "zmień nazwy podpakietów" ręcznie.

Oto kod wtyczki:

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); 
    } 
} 

Oto 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> 

I manifest:

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

I ... +1. Tym razem to * powinno * liczyć w swoim dziennym limicie;) – VonC

+0

dzięki bardzo, teraz wystarczy 562 więcej –

0

Umm, nie wiem, co wszyscy tutaj robi, ale w Eclipse Juno kliknij prawym przyciskiem myszy packacge -> refactor -> zmień nazwę na

Następnie zmień nazwy swoich paczek i zaznacz to pole, jeśli chcesz, aby zmiany kolidowały z hierarchią.