java - Renombrar paquetes en Eclipse
refactoring (5)
En el "Explorador de paquetes" de Eclipse, digamos que tengo una lista de paquetes como esta:
- com.dog
- com.cat
- com.frog
Si quiero cambiar el nombre de la parte "com" de la estructura del paquete para que sea "animal", entonces podría seleccionar cada paquete (arriba) y realizar un refactor> renombrar.
Si tengo muchos paquetes que comienzan con "com", ese proceso puede tardar un tiempo. ¿Existe alguna manera fácil de cambiar el nombre del nombre del paquete "com" sin tener que cambiar el nombre de cada paquete individualmente en el Explorador de paquetes? o eliminar esos paquetes de la ruta de compilación antes de cambiar el nombre?
Intenté ir al panel "Navegador", donde muestra las carpetas en una estructura de árbol, pero no tengo la capacidad de cambiar el nombre.
Crea un archivo en tu paquete ''com''. Cambie el nombre y seleccione ''Renombrar subpaquetes''. Eliminar el archivo
He intentado implementar un complemento para cambiar el nombre de los paquetes principales. Agrega un elemento "Cambiar el nombre del paquete primario" al menú contextual de, o puede ser activado por ctrl-7 .
No he implementado el código para habilitar / deshabilitar el elemento del menú según la selección activa (hay alguna condición de carrera que hace que el asistente deje de cancelar). Si la selección activa es un paquete con un paquete principal, seleccionará ese elemento principal e iniciará el asistente de cambio de nombre. Aún deberá seleccionar "cambiar nombre de subpaquetes" manualmente.
Aquí está el código del complemento:
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);
}
}
Aquí está el 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>
Y el manifiesto:
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
Parece que la API JDT actual (Java Development Tool, la parte que incluye el cambio de nombre del paquete) solo cambia el nombre de un paquete a la vez (y no de los subpaquetes)
Ver:
Al refactorizar un paquete, que tiene subpaquetes, JDT crea paquetes secundarios nuevamente, en lugar de simplemente cambiar el nombre del padre
necesitamos una API en
IPackageFragment
para cambiar el nombre no solo del fragmento sino también de todos los subpaquetes.
Efectivamente, la implementación cambiaría el nombre de la carpeta del fragmento del paquete y luego actualizaría las declaraciones del paquete en todas las CU contenidas (incluidas las de los subpaquetes)
Entonces es "por diseño" en ese momento (eclipse 3.5), pero se registra una mejora y se tendrá en cuenta para 3.6.
Nota: ¡esa "falta de característica" se ha notado desde 2005!
Estaba probando el nuevo cambio de nombre del paquete jerárquico y tenía dos carpetas de origen con la misma estructura de paquete. Para cambiar el nombre de los paquetes en ambos tuve que hacer la misma operación dos veces.
Sería bueno obtener una pista y que se le pregunte si el cambio de nombre del paquete también debe aplicarse a la (s) otra (s) carpeta (s) de origen.
Por defecto, los paquetes principales vacíos están ocultos en el explorador de paquetes, si modifica los filtros ... en el Explorador de paquetes para desmarcar los paquetes vacíos principales (tercero desde arriba en la segunda captura de pantalla) podrá ver los paquetes vacíos.
A continuación, puede cambiar el nombre del paquete com y marcar la opción Renombrar subpaquetes para forzar el cambio de nombre de todos los paquetes secundarios.
Luego, cuando haya terminado, vuelva a aplicar el filtro para ocultar todos esos paquetes vacíos de nuevo.
Umm, no sé lo que hacen los demás aquí, pero en Eclipse Juno, haga clic derecho en el paquete -> refactor -> cambiar el nombre
A continuación, cambie el nombre de sus paquetes y marque la casilla si desea que los cambios entren en cascada en la jerarquía.