web-dev-qa-db-fra.com

Renommer des packages dans Eclipse

Dans "l'explorateur de packages" d'Eclipse, disons que j'ai une liste de packages comme celui-ci:

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

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

Si j'ai de nombreux packages commençant par "com", ce processus peut prendre un certain temps. Existe-t-il un moyen simple de renommer le nom du package "com" sans avoir à renommer individuellement chaque package dans l'Explorateur de packages? ou supprimer ces packages du chemin de génération avant de renommer?

J'ai essayé d'aller dans le volet "Navigateur" où il affiche les dossiers dans une arborescence, mais je n'ai pas la possibilité de renommer.

31
digiarnie

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

package Explorer filters

filters view
(source: Eclipse.org )

Vous pouvez ensuite renommer le package com et cocher l'option Renommer les sous-packages pour forcer tous les packages enfants à être renommés.

rename package
(source: Eclipse.org )

Ensuite, lorsque vous avez terminé, réappliquez le filtre pour masquer à nouveau tous ces packages vides.

55
Rich Seller

Il semble que l'API JDT actuelle (Java Development Tool, la partie qui inclut le changement de nom des packages) ne renomme qu'un seul package à la fois (et non les sous-packages)

Voir:

Lors de la refactorisation d'un package contenant des sous-packages, JDT crée à nouveau des packages enfants, au lieu de simplement renommer le parent

nous avons besoin d'une API sur IPackageFragment pour renommer non seulement le fragment mais aussi tous les sous-packages.
En fait, l'implémentation renomme le dossier du fragment de package, puis met à jour les déclarations de package dans toutes les UC contenues (y compris celles des sous-packages)

C'est donc "par conception" à ce moment-là (Eclipse 3.5), mais une amélioration est enregistrée et sera prise en compte pour 3.6.

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

Je testais le nouveau changement de nom du package hiérarchique et j'avais deux dossiers source avec la même structure de package. Pour renommer les packages dans les deux, j'ai dû faire la même opération deux fois.
Ce serait bien d'obtenir un indice et qu'on lui demande si le renommage du package devrait également être appliqué aux autres dossiers source.

6
VonC

Créez un fichier dans votre package 'com'. Renommez-le et cochez "Renommer les sous-packages". Supprimez le fichier.

4
Christopher Klewes

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

Je n'ai pas implémenté le code pour activer/désactiver l'élément de menu en fonction de la sélection active (il y a une condition de concurrence qui provoque l'arrêt de l'annulation par l'assistant). Si la sélection active est un package avec un package parent, il sélectionnera ce parent et lancera l'assistant de renommage. Vous devrez toujours sélectionner "renommer les sous-packages" 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
3
Rich Seller

Umm, je ne sais pas ce que font les autres ici, mais dans Eclipse Juno, faites un clic droit sur le packacge -> refactor -> rename

Ensuite, renommez simplement vos packages et cochez la case si vous souhaitez que les modifications se répercutent dans la hiérarchie.

0
Scuba Steve