2010-01-26 12 views
18

Tengo un proyecto creado por otros que incluye miles de archivos de clase y tiene los nombres de los paquetes explícitamente escritos para cada referencia a cualquiera de sus clases. Parece que el código fue de ingeniería inversa. ¿Hay una buena herramienta para Java que refactoriza el código para que los prefijos de los paquetes explícitamente tipeados se eliminen de las referencias de clase y se muevan a las sentencias de importación?Eliminar automáticamente declaraciones de paquetes explícitas con instrucciones de importación en Java

Gracias de antemano.

EDIT:

creo un ejemplo ayudará. Quiero tener las importaciones en la parte superior, y no me importa cuántas importaciones hay.

javax.swing.JButton button1 = new javax.swing.JButton(); 

Imagínese el código anterior, pero absolutamente todas partes en miles y miles de líneas de código entre miles de archivos de clase. Me gustaría poder eliminar todos los prefijos y tener una buena importación javax.swing.JButton; en la parte superior de cada archivo de clase.

+0

Esto es simplemente incorrecto. No deberíamos robarles a otros, y no deberíamos ayudar a nadie a hacerlo. – irreputable

+4

@irreputable: esto no es necesariamente un robo. este puede ser un caso donde el usuario tiene derecho a usar una lib, pero el fabricante original o responsable se ha ido, y con él el código fuente y posibles correcciones de errores. En estos casos, todo lo que puede hacer es invertir la situación e intentar corregir los errores usted mismo –

+2

Nadie está robando el trabajo de nadie. Estoy trabajando en un proyecto de investigación con mi universidad que tiene permiso explícito para usar y modificar el código fuente de otra universidad. – AlbertoPL

Respuesta

8

No conozco una herramienta para este caso de uso, pero tuve que hacer algo similar hace unos meses.

  • Escriba un script o haga una búsqueda reemplace con regex para deshacerse de los prefijos del paquete tipeado explícitamente.

  • Que el eclipse haga el resto usando "organizar importaciones". Ctrl-1

Sugerencia: para evitar ambigüedades, configure el classpath con solo las librerías necesarias. Para alrededor de 800 clases, terminé en 2 horas.

  • O consigue a alguien que lo merezca para hacer este trabajo.

EDITAR: Debe saber que en Preferencias/Java/Editor/Guardar acciones, Organizar importaciones se puede configurar como acción de guardado.

+0

Sí, esto es lo que pensé que tendría que hacer. Solo 2 horas una vez que se escribe la expresión regular ... suena prometedor y puede estar haciendo eso. Gracias. – AlbertoPL

+4

+1 para el último punto de viñeta. –

+0

Puede que no sea tan simple como eliminar todas las referencias explícitas de paquetes; si hay ambigüedades (el mismo nombre de clase), entonces esas referencias explícitas deben permanecer. –

2

This thread dice:

seleccione la vista Explorador de paquetes, haga clic derecho en su proyecto, seleccionar la fuente a continuación, organizar las importaciones. Bobs su tío - todas las importaciones no deseadas se eliminan

para que sea mejor el formato:

Right click project > Source > Organize imports

Ahora, lo que queda, es encontrar una manera de quitar los nombres totalmente calificados a partir del código . Puede pensar en alguna expresión regular. Eche un vistazo al this library - parece útil. This article también debería ser útil.

+1

Esto no cambiará las declaraciones de tipos totalmente calificadas (por ejemplo, 'java.awt.Font foo') a las declaraciones no calificadas (por ejemplo,' Fuente foo') con las instrucciones de importación. Al menos, este es el caso en Eclipse 3.5. – McDowell

+0

sí, actualicé mi respuesta con el siguiente (anterior, en realidad) paso hacia ese objetivo – Bozho

+0

Biblioteca y artículo interesante ... Tendré que examinar estos para ver qué fácil puedo aplicarlo a mi proyecto, gracias. – AlbertoPL

5

Para un solo tipo, eclipse ofrece la acción 'Agregar importación' (Shift + Ctrl + M). Hace exactamente lo que quiere, con la gran y gran limitación: tiene que colocar el cursor en un tipo y solo afectará la ocurrencia 'seleccionada'.

Pero tal vez esta acción se puede utilizar en un método guionado/global.Un complemento JDT podría rastrear a través del AST y llamar a esta acción en cada tipo que encuentre.

+0

Tendré que buscar en las secuencias de comandos que, sin embargo, no sé si sería más fácil simplemente escribir un script que encuentre y reemplace el uso de una expresión regular. Aún así, si pudiera encontrar un plugin que ya está escrito, ciertamente intentaré usarlo. Gracias. – AlbertoPL

1

IntelliJ Idea tiene herramientas para hacer esto por archivo. Probablemente también puedas hacerlo a granel, pero no sé cómo.

Pruebe una evaluación de 30 días y probablemente le complazcan más las funciones de limpieza de importación.

0

Probablemente necesite reemplazar todo javax.swing.. Entonces organice las importaciones.

1

Tuve el mismo problema con los archivos generados por el eje, y escribí una pequeña secuencia de comandos groovy para hacer esto. No hago todo (tienes que usar las importaciones de organizar en eclipse después de que lo ejecutas), y no lo he probado muy bien, así que úsalo con cuidado. También se limita a nombres de paquetes minúsculas y nombres de las clases de camellos con carcasa, pero puede ser un buen punto de partida

def replaceExplicitPackageNamesInFile(File javaFile){ 
eol = org.codehaus.groovy.tools.Utilities.eol() 

newFile = "" 
explicitImportExpr = /([^\w])(([a-z0-9]+\.)+)([A-Z][a-zA-Z0-9]+)/ 
imports = "" 
javaFile.eachLine { 
    line = it.replaceAll(explicitImportExpr, { 
    Object [] match -> 
    imports += "import ${match[2]+match[-1]};${eol}" 
    match[1]+match[-1] 
    }) 
    newFile += line+"${eol}" 
} 
newFile2 = "" 
newFile.eachLine { line -> 
    newFile2 += 
    line.replaceAll(/(^\s*package.*$)/, { 
    Object [] match -> 
    match[0] + eol + imports 
    }) + eol 
} 
javaFile.setText(newFile2) 
} 

def replaceExplicitPackageNamesInDir(File dir){ 
dir.eachFileRecurse { 
    if (it.isFile() && it.name ==~ /.*\.java\z/){ 
    println "Processing ${it.absolutePath - dir.absolutePath}" 
    replaceExplicitPackageNamesInFile(it) 
    } 
} 
} 
0

he sido capaz de eliminar todos los nombres de los paquetes explícitos en las interfaces mediante la ejecución del comando sed a continuación en los archivos de destino y luego reorganizar por las importaciones en Eclipse:

sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g' 
2

uso un Eclipse plugin por Michael Ernst que hace lo que quiere. Convierte referencias como java.util.Collection a Collection con la adición de un import java.util.Collection; en la parte superior del archivo.

Es efectivamente lo mismo que usar "Fuente -> Agregar importación" para una referencia totalmente calificada, excepto que le permite hacer todo un archivo .java a la vez.

Mejor aún, le permite procesar por lotes todos los archivos .java que ha seleccionado en el Explorador de paquetes. Simplemente haga clic derecho en la selección y seleccione "Fuente -> Limpiar Declaraciones de Tipo Calificadas" desde el menú contextual.

sitio de actualización de Eclipse: http://cqtp.sourceforge.net/eclipse/

Cuestiones relacionadas