¿Formateador / embellecedor / bonita impresora de código Java independiente? [cerrado]

84

Estoy interesado en conocer las opciones disponibles de formateadores de código fuente independientes de alta calidad para Java.

El formateador debe ser autónomo, es decir, debe admitir un modo "por lotes" que esté desacoplado de cualquier entorno de desarrollo en particular . Idealmente, también debería ser independiente de cualquier sistema operativo en particular . Por lo tanto, un formateador incorporado para el IDE del día es de poco interés aquí (a menos que el IDE admita la invocación del formateador en modo por lotes, quizás desde la línea de comandos). Un formateador escrito en C / C ++ de código cerrado que solo se ejecuta, digamos, en Windows no es ideal, pero es algo interesante.

Para ser claros, un "formateador" (o "embellecedor") no es lo mismo que un "corrector de estilo". Un formateador acepta código fuente como entrada, aplica reglas de estilo y produce código fuente con estilo que es semánticamente equivalente al código fuente original. Las modificaciones sintácticas se limitan a cosas como modificar el diseño del código como cambiar el espacio en blanco u organizar importdeclaraciones. Se realiza muy poca o ninguna otra refactorización. Un verificador de estilo también aplica reglas de estilo, pero simplemente informa violaciones de reglas sin producir código fuente modificado como salida. Entonces la imagen se ve así:

Formateador (produce código fuente modificado que se ajusta a las reglas de estilo)

Leer código fuente → Aplicar reglas de estilo → Escribir código fuente con estilo

Style Checker (no produce código fuente modificado)

Leer código fuente → Aplicar reglas de estilo → Escribir infracciones de reglas

Más aclaraciones

Las soluciones deben ser altamente configurables. Quiero poder especificar mi propio estilo, no simplemente seleccionar de una lista preestablecida.

Además, no estoy buscando una impresora bonita de propósito general escrita en Java que pueda imprimir muchas cosas. Quiero diseñar el código Java.

También estoy no necesariamente interesado en un formateador-grand unificada para muchos idiomas. Supongo que sería bueno que una solución tuviera soporte para lenguajes distintos de Java, pero eso no es un requisito.

Además, las herramientas que sólo realizan el código de relieve son derecho a cabo .

Tampoco estoy interesado en un servicio web. Quiero una herramienta que pueda ejecutar localmente.

Finalmente, las soluciones no necesitan limitarse a código abierto, dominio público, shareware, software libre, comercial o cualquier otra cosa. Se aceptan todas las formas de concesión de licencias .

Greg Mattes
fuente
1
Creé algo que es un Helios independiente (Eclipse 3.6) que solo formatea el código. Es <13 MB, solo Java. openmrs-mailing-list-archives.1560443.n2.nabble.com/…
Миша Кошелев

Respuestas:

25

JIndent (Comercial) hace lo que quiere:

http://www.jindent.com/

También he usado Jalopy en el pasado para hacer esto, es de código abierto:

http://jalopy.sourceforge.net/

EDITAR: Notaré que Jalopy es bastante antiguo y no parece haber ninguna actualización reciente. No estoy muy seguro de si funcionará con Java 5/6. Quizás quieras mirar a Jacobe en su lugar:

http://www.tiobe.com/index.php/content/products/jacobe/Jacobe.html

También hay una lista más completa de formateadores aquí en el sitio de Roedy Green:

http://mindprod.com/jgloss/beautifier.html

Jon
fuente
¿Cuál es la relación entre Jalopy de código abierto y este ?: triemax.com/products/jalopy
Greg Mattes
Parece que el proyecto de código abierto está muerto y han decidido optar por una versión comercial, producida por Triemax. Ha pasado mucho tiempo desde que usé Jalopy, creo que fue con Ant. En su lugar, eche un vistazo a Jacobe.
Jon
Jacobe no se está actualizando para Java 7, y TIOBE dice que nunca lo será.
Chris Jones
1
También está el formato google-java .
mrts
14

También puede ejecutar el reformateo de Eclipse desde la línea de comandos.

Aquí está la documentación de Eclipse de la función

Primero debe crear un archivo de configuración específico para su proyecto de la configuración del formateador de código Java.

Luego, guárdelo {projectDirectory}/.settings/org.eclipse.jdt.core.prefsen otra ubicación.

Ahora llamarás al formateador.

"c:\path\to\eclipse\eclipse.exe" -vm "C:\path\to\jdk\bin\java.exe" -application org.eclipse.jdt.core.JavaCodeFormatter -config "c:\path\to\org.eclipse.jdt.core.prefs" "C:\path\to\your\src"

[ADVERTENCIA] Esto parece haber dejado de funcionar en Eclipse 2018. Use Eclipse Oxygen.

notnoop
fuente
7

Jalopy puede ser de interés. Se conectará a Ant y, por lo tanto, es independiente de su IDE.

Astyle también puede ser útil. Es de código abierto (como Jalopy) pero escrito en C ++. Está orientado a formatear Java / C / C ++ y puede ser controlado por lotes (a través de scripts de shell o similares)

Brian Agnew
fuente
4

ACTUALIZACIÓN: Según mi nuevo conocimiento basado en un informe de error incorrecto que presenté: https://bugs.eclipse.org/bugs/show_bug.cgi?id=325289 El archivo OpenMRSFormatter.xml en realidad tiene que ser un archivo de preferencias y no un XML archivo.

Puede encontrar un archivo de este tipo aquí: https://bugs.eclipse.org/bugs/attachment.cgi?id=178874

o convierta cualquier archivo de formato XML exportado con: cat formatter.xml | ajuste grep | sed 's / @@'> formatter.asprefs

Gracias misha


Aquí hay algo que hice usando frascos Eclipse 3.6. Es solo Java, línea de comandos y debe ser compatible con plataformas cruzadas:

http://www.sendspace.com/file/nm4ptt

Hay un script de shell que usa un archivo OpenMRSCodeFormatter.xml incluido. La salida de muestra:

misha@misha-d630:~/openmrs-code-formatter$ cat ../Test.java
public class Test {



public a() {
System.out.println("! I did not format this right!");
}



}misha@misha-d630:~/openmrs-code-formatter$ ./format.sh ../Test.java
Configuration Name: OpenMRSFormatter.xml
Starting format job ...
Done.
cat ../misha@misha-d630:~/openmrs-code-formatter$ cat ../Test.java
public class Test {

        public a() {
                System.out.println("! I did not format this right!");
        }

}misha@misha-d630:~/openmrs-code-formatter$ 

Esto se basa en la publicación aquí: http://www.peterfriese.de/formatting-your-code-using-the-eclipse-code-formatter/

Como no sé cuánto tiempo permanecerá activo el enlace, describiré el contenido a continuación.

Esto se basa en la distribución de Eclipse 3.6 Helios. Usé el de Linux x86, pero debería funcionar para cualquier versión, ya que no usé ningún archivo JAR específico de la plataforma (que yo sepa).

Los contenidos del archivo tar son:

misha@misha-d630:~$ tar tvjf openmrs-code-formatter.tar.bz2  | sort 
tar: Record size = 8 blocks
drwxr-xr-x misha/misha       0 2010-09-11 19:32 openmrs-code-formatter/plugins/
drwxr-xr-x misha/misha       0 2010-09-11 19:33 openmrs-code-formatter/configuration/org.eclipse.equinox.simpleconfigurator/
drwxr-xr-x misha/misha       0 2010-09-11 19:38 openmrs-code-formatter/configuration/
-rw-r--r-- misha/misha  101957 2010-09-11 19:03 openmrs-code-formatter/plugins/org.eclipse.equinox.common_3.6.0.v20100503.jar
-rw-r--r-- misha/misha  107210 2010-09-11 19:32 openmrs-code-formatter/plugins/org.eclipse.core.commands_3.6.0.I20100512-1500.jar
-rw-r--r-- misha/misha  111098 2010-09-11 19:06 openmrs-code-formatter/plugins/org.eclipse.equinox.preferences_3.3.0.v20100503.jar
-rw-r--r-- misha/misha 1147220 2010-09-11 18:45 openmrs-code-formatter/plugins/org.eclipse.osgi_3.6.0.v20100517.jar
-rw-r--r-- misha/misha    1812 2010-09-11 19:33 openmrs-code-formatter/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info
-rw-r--r-- misha/misha  182596 2010-09-11 19:05 openmrs-code-formatter/plugins/org.eclipse.equinox.registry_3.5.0.v20100503.jar
-rw-r--r-- misha/misha  248071 2010-09-11 19:29 openmrs-code-formatter/plugins/org.eclipse.text_3.5.0.v20100601-1300.jar
-rw-r--r-- misha/misha     265 2010-09-11 19:21 openmrs-code-formatter/configuration/config.ini
-rw-r--r-- misha/misha   28554 2010-09-11 19:34 openmrs-code-formatter/OpenMRSFormatter.xml
-rw-r--r-- misha/misha   39331 2010-09-11 19:17 openmrs-code-formatter/plugins/org.eclipse.equinox.simpleconfigurator_1.0.200.v20100503.jar
-rw-r--r-- misha/misha 4504121 2010-09-11 19:27 openmrs-code-formatter/plugins/org.eclipse.jdt.core_3.6.0.v_A58.jar
-rw-r--r-- misha/misha   47023 2010-09-11 18:42 openmrs-code-formatter/plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
-rw-r--r-- misha/misha   52710 2010-09-11 19:29 openmrs-code-formatter/plugins/org.eclipse.core.filesystem_1.3.0.v20100526-0737.jar
-rw-r--r-- misha/misha 6451211 2010-09-11 19:32 openmrs-code-formatter/plugins/com.ibm.icu_4.2.1.v20100412.jar
-rw-r--r-- misha/misha   70928 2010-09-11 19:01 openmrs-code-formatter/plugins/org.eclipse.core.runtime_3.6.0.v20100505.jar
-rw-r--r-- misha/misha  769898 2010-09-11 19:29 openmrs-code-formatter/plugins/org.eclipse.core.resources_3.6.0.v20100526-0737.jar
-rw-r--r-- misha/misha   83817 2010-09-11 19:07 openmrs-code-formatter/plugins/org.eclipse.equinox.app_1.3.0.v20100512.jar
-rw-r--r-- misha/misha   86986 2010-09-11 19:31 openmrs-code-formatter/plugins/org.eclipse.core.expressions_3.4.200.v20100505.jar
-rw-r--r-- misha/misha   90837 2010-09-11 19:05 openmrs-code-formatter/plugins/org.eclipse.core.jobs_3.5.0.v20100515.jar
-rw-r--r-- misha/misha   91928 2010-09-11 19:06 openmrs-code-formatter/plugins/org.eclipse.core.contenttype_3.4.100.v20100505-1235.jar
-rwxr-xr-x misha/misha     111 2010-09-11 19:39 openmrs-code-formatter/format.sh

Los archivos jar relevantes en el directorio de complementos se toman directamente del directorio de complementos de Eclipse 3.6.

Los contenidos de config.ini son:

misha@misha-d630:~$ more openmrs-code-formatter/configuration/config.ini 
osgi.bundles=reference\:file\:org.eclipse.equinox.simpleconfigurator_1.0.200.v20100503.jar@1\:start
org.eclipse.equinox.simpleconfigurator.configUrl=file\:org.eclipse.equinox.simpleconfigurator/bundles.info
eclipse.application=org.eclipse.jdt.core.JavaCodeFormatter

format.sh es:

misha@misha-d630:~$ more openmrs-code-formatter/format.sh 
#!/bin/bash
java -jar plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar -config OpenMRSFormatter.xml $*

y OpenMRSFormatter.xml está disponible aquí: http://wiki.openmrs.org/download/attachments/3346087/OpenMRSFormatter.xml?version=1&modificationDate=1282168038000

Creo que debería ser suficiente para reproducirse.

Un proyecto interesante basado en el mismo concepto se encuentra aquí: http://code.google.com/p/maven-java-formatter-plugin/

Gracias misha

Миша Кошелев
fuente
1

Solía ​​usar Dr. Java para codificar y con una rápida pestaña ctrl + A + lo formatea todo muy bien con resaltado de sintaxis. Lo he usado en Mac y Windows, no sé si son compatibles con Linux. Y es de código abierto, independiente y gratuito.

Petey B
fuente
Al presionar el tabulador cuando se selecciona cualquier parte del código, se formateará la selección. DrJava también es una bonita pestaña interactiva (como intérprete).
dansalmo
0

También usé mucho PrettyPrinter incrustado dentro de JRefactory ( http://jrefactory.sourceforge.net/ ). Lo descubrí a través de su complemento para JEdit. Lo aprecié porque tenía la mejor cobertura de javadoc que jamás haya visto.

Desafortunadamente, parece muerto (sin evolución desde 2004) y en realidad no es compatible con Java5.

Por cierto, confirmo que Triemax es una suite comercial basada en Jalopy de código abierto muerto.

Michael Zilbermann
fuente
0

Consulte nuestro Formateador de Java para obtener una herramienta que maneja todos los dialectos de Java, incluida la versión 7.

Ira Baxter
fuente
0

Jalopy no maneja declaraciones como List stuff <MyClass> ... y comentarios de lint que comienzan con @

He podido forzarlo a formatear cambiando todos los <MyClass> a LTLTLTMyClassGTGTGT y luego @ a // @ // @ // @ (solo repito LT, GT o // @ para asegurarme de que no Ya existen. Entonces pude hacer Jalopy, y obviamente tengo que reemplazar todo de nuevo a lo que era.

Además, antes de cambiar <o>, debe asegurarse de no cambiar comparaciones como <= o> =, etc.

Entonces, podría llamar a esto la solución del hombre pobre porque implica muchos pasos manuales. Si tuviera que hacer Jalopy con más frecuencia, probablemente escribiría un script usando sed que haría esos cambios automáticamente por mí.

UPC
fuente