Dans "l'explorateur de packages" d'Eclipse, disons que j'ai une liste de packages comme celui-ci:
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.
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.
(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.
(source: Eclipse.org )
Ensuite, lorsque vous avez terminé, réappliquez le filtre pour masquer à nouveau tous ces packages vides.
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.
Créez un fichier dans votre package 'com'. Renommez-le et cochez "Renommer les sous-packages". Supprimez le fichier.
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
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.