32 votes

Renommer des paquets dans Eclipse

Dans le "Package Explorer" d'Eclipse, disons que j'ai une liste de paquets comme ceci :

  • com.dog
  • com.cat
  • com.grenouille

Si je veux renommer la partie "com" de la structure du paquet en "animal", je pourrais sélectionner chaque paquet (ci-dessus) et effectuer un refactor > rename.

Si j'ai beaucoup de paquets qui commencent par "com", ce processus peut prendre un certain temps. Existe-t-il un moyen simple de renommer le nom du paquet "com" sans avoir à renommer individuellement chaque paquet dans l'explorateur de paquets ? ou à supprimer ces paquets du chemin de construction avant de les renommer ?

J'ai essayé d'accéder au volet "Navigateur", qui affiche les dossiers sous forme d'arborescence, mais je n'ai pas la possibilité de les renommer.

0 votes

Consultez la réponse de Rich ( stackoverflow.com/questions/1355818/ ) : si cela fonctionne pour vous, vous pourriez le définir comme le modèle officiel.

57voto

Rich Seller Points 46052

Par défaut, les paquets parents vides sont cachés dans l'explorateur de paquets, si vous modifiez l'attribut Filtres... dans l'Explorateur de paquets pour décocher Paquets vides pour les parents (troisième à partir du haut dans la deuxième capture d'écran), vous pourrez voir les paquets vides.

package explorer filters

filters view
(source : <a href="http://archive.eclipse.org/eclipse/downloads/drops/R-2.1-200303272130/images/non-shared-project-filter.gif" rel="nofollow noreferrer">eclipse.org </a>)

Vous pouvez ensuite renommer le com et vérifiez le Renommer les sous-paquets pour forcer tous les paquets enfants à être renommés.

rename package
(source : <a href="http://archive.eclipse.org/eclipse/downloads/drops/R-3.2-200606291905/new_noteworthy/images/hierarchical_package_rename.png" rel="nofollow noreferrer">eclipse.org </a>)

Puis, lorsque vous avez terminé, réappliquez le filtre pour cacher à nouveau tous ces paquets vides.

0 votes

Bien vu, Rich. +1. Peut-être que votre réponse devrait être la réponse officielle.

0 votes

Quoi ? Je n'ai pas vraiment fait le vote positif ? Désolé. Je voulais vraiment le faire. Eh bien, mieux vaut tard que jamais... ;)

0 votes

Vous êtes très gentil. Juste après avoir atteint la limite de répétition pour aujourd'hui, naturellement.

6voto

VonC Points 414372

Il semble que l'API JDT actuelle (Java Development Tool, la partie qui inclut le renommage des paquets) ne renomme qu'un seul paquet à la fois (et pas les sous-paquets).

Voir :

Lors du remaniement d'un paquet qui a des sous-paquets, JDT crée des paquets enfants. à nouveau, au lieu de simplement renommer le parent

nous avons besoin d'une API sur IPackageFragment pour renommer non seulement le fragment fragment mais aussi tous les sous-paquets.
En fait, l'implémentation renommerait le dossier du fragment de paquetage et mettrait à jour les déclarations de paquetage dans toutes les CU contenues (y compris celles des sous-paquets).

C'est donc "by design" pour le moment (eclipse 3.5), mais une amélioration est enregistrée et sera prise en compte pour la 3.6.

Remarque : ce "manque de fonctionnalité" est constaté depuis 2005 !

Je testais le nouveau renommage hiérarchique des paquets et j'avais deux dossiers sources avec la même structure de paquet. Pour renommer les paquets dans les deux, j'ai dû effectuer la même opération deux fois.
Ce serait bien d'avoir un indice et d'être invité à dire si le renommage du paquet devrait s'applique également aux autres dossiers sources.

4voto

codevour Points 3246

Créez un fichier dans votre paquetage 'com'. Renommez-le et cochez la case "Renommer les sous-paquets". Supprimez le fichier.

0 votes

Merci pour la remarque sur le "renommer les sous-paquets" - cela m'a aidé à comprendre pourquoi la solution proposée par Andy et MatrixFrog n'a pas fonctionné pour moi (c'est ma faute).

3voto

Rich Seller Points 46052

J'ai essayé d'implémenter un plugin pour renommer les paquets parents. Il ajoute un élément "Renommer le paquet parent" au menu contextuel de , ou peut être déclenché par ctrl-7 .

Je n'ai pas implémenté le code permettant d'activer/désactiver l'élément de menu en fonction de la sélection active (il y a une condition de course qui fait que l'assistant ne s'annule plus). Si la sélection active est un paquet avec un paquet parent, il sélectionnera ce parent et lancera l'assistant de renommage. Vous devrez toujours sélectionner "renommer les sous-paquets" manuellement.

Voici le code du plugin :

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

Voici le 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>

Et le manifeste :

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 votes

Et... +1. Cette fois, c'est debe compter dans votre limite quotidienne ;)

0voto

Scuba Steve Points 382

Umm, je ne sais pas ce que tout le monde fait ici, mais dans Eclipse Juno, faites un clic droit sur le paquet -> refactor -> renommer

Il suffit ensuite de renommer vos paquets et de cocher la case si vous souhaitez que les modifications soient répercutées en cascade dans la hiérarchie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X