Formattatore di codice Java autonomo / abbellitore / stampante carina? [chiuso]


84

Sono interessato a conoscere le scelte disponibili di formattatori di codice sorgente indipendenti di alta qualità per Java.

Il formattatore deve essere autonomo, cioè, deve supportare una modalità "batch" che viene disaccoppiato da un particolare ambiente di sviluppo . Idealmente, dovrebbe essere indipendente anche da un particolare sistema operativo . Quindi, un formattatore integrato per l'IDE du jour è di scarso interesse qui (a meno che quell'IDE non supporti l'invocazione del formattatore in modalità batch, forse dalla riga di comando). Un formattatore scritto in C / C ++ closed-source che gira, diciamo, solo su Windows non è l'ideale, ma è piuttosto interessante.

Per essere chiari, un "formattatore" (o "beautifier") non è la stessa cosa di un "controllo di stile". Un formattatore accetta il codice sorgente come input, applica regole di stile e produce codice sorgente con stile che è semanticamente equivalente al codice sorgente originale. Le modifiche sintattiche sono limitate a cose come la modifica del layout del codice come la modifica degli spazi bianchi o l'organizzazione delle importistruzioni. Viene eseguito molto poco, se del caso, altro refactoring. Un controllo di stile applica anche regole di stile, ma segnala semplicemente le violazioni delle regole senza produrre codice sorgente modificato come output. Quindi l'immagine appare così:

Formattatore (produce codice sorgente modificato conforme alle regole di stile)

Leggi codice sorgente → Applica regole di stile → Scrivi codice sorgente con stile

Style Checker (non produce codice sorgente modificato)

Leggi il codice sorgente → Applica regole di stile → Scrivi violazioni delle regole

Ulteriori chiarimenti

Le soluzioni devono essere altamente configurabili. Voglio essere in grado di specificare il mio stile, non semplicemente selezionarlo da un elenco predefinito.

Inoltre, non sto cercando una stampante carina per uso generale scritta in Java che possa stampare in modo carino molte cose. Voglio modellare il codice Java.

Inoltre, non sono necessariamente interessato a un formattatore unificato per molte lingue. Suppongo che potrebbe essere bello per una soluzione avere il supporto per linguaggi diversi da Java, ma questo non è un requisito.

Inoltre, gli strumenti che eseguono solo il codice evidenziazione sono a destra fuori .

Inoltre non sono interessato a un servizio web. Voglio uno strumento che posso eseguire localmente.

Infine, le soluzioni non devono essere limitate a open source, dominio pubblico, shareware, software libero, commerciale o qualsiasi altra cosa. Sono accettabili tutte le forme di licenza .


1
Ho montato qualcosa che è un Helios autonomo (Eclipse 3.6) che fa solo la formattazione del codice. È <13 MB, solo Java. openmrs-mailing-list-archives.1560443.n2.nabble.com/…
Миша Кошелев

Risposte:


25

JIndent (commerciale) fa quello che vuoi:

http://www.jindent.com/

Ho anche usato Jalopy in passato per farlo, è open source:

http://jalopy.sourceforge.net/

EDIT: noterò che Jalopy è abbastanza vecchio e non sembra esserci alcun aggiornamento recente. Non sono abbastanza sicuro che funzionerà con Java 5/6. Potresti invece voler guardare Jacobe:

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

C'è anche un elenco più completo di formattatori qui sul sito di Roedy Green:

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


Qual è la relazione tra l'open source Jalopy e questo: triemax.com/products/jalopy
Greg Mattes

Sembra che il progetto open source sia morto e hanno deciso di utilizzare una versione commerciale - prodotta da Triemax. È passato molto tempo da quando ho usato Jalopy, credo fosse con Ant. Dai un'occhiata invece a Jacobe.
Jon

Jacobe non viene aggiornato per Java 7 e TIOBE afferma che non lo sarà mai.
Chris Jones

1
C'è anche il formato google-java .
mrts

14

È inoltre possibile eseguire il riformattatore Eclipse dalla riga di comando.

Ecco la documentazione Eclipse della funzionalità

Per prima cosa devi creare il file di configurazione specifico per il tuo progetto delle impostazioni del formattatore del codice Java.

Quindi salva {projectDirectory}/.settings/org.eclipse.jdt.core.prefsin un'altra posizione.

Ora chiamerai il formattatore.

"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"

[ATTENZIONE] Questo sembra aver smesso di funzionare in Eclipse 2018. Usa Eclipse Oxygen.


7

Jalopy potrebbe interessarti. Si collegherà ad Ant e quindi è indipendente dal tuo IDE.

Anche Astyle può essere utile. È open source (come Jalopy) ma scritto in C ++. È orientato alla formattazione di Java / C / C ++ e può essere gestito in batch (tramite script di shell o simili)


4

AGGIORNAMENTO: Secondo la mia nuova comprensione basata su una segnalazione di bug errata che ho archiviato: https://bugs.eclipse.org/bugs/show_bug.cgi?id=325289 Il file OpenMRSFormatter.xml in realtà deve essere un file delle preferenze e non un XML file.

Puoi trovare un file di questo tipo qui: https://bugs.eclipse.org/bugs/attachment.cgi?id=178874

o converti qualsiasi file di formattazione esportato XML con: cat formatter.xml | impostazione grep | sed 's / @@'> formatter.asprefs

Grazie Misha


Ecco qualcosa che ho realizzato utilizzando i barattoli Eclipse 3.6. È solo Java, riga di comando e dovrebbe essere compatibile con più piattaforme:

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

Esiste uno script di shell che utilizza un file OpenMRSCodeFormatter.xml in bundle. L'output di esempio:

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$ 

Questo si basa sul post qui: http://www.peterfriese.de/formatting-your-code-using-the-eclipse-code-formatter/

Poiché non so per quanto tempo rimarrà attivo il collegamento, descriverò i contenuti di seguito.

Questo è basato sulla distribuzione di Eclipse 3.6 Helios. Ho usato quello per Linux x86, ma dovrebbe funzionare per qualsiasi versione, in quanto non ho utilizzato alcun file JAR specifico della piattaforma (per quanto ne so).

I contenuti dell'archivio tar sono:

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

I jar rilevanti nella directory dei plugin sono presi direttamente dalla directory dei plugin di Eclipse 3.6.

I contenuti di config.ini sono:

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 è:

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 $*

e OpenMRSFormatter.xml è disponibile qui: http://wiki.openmrs.org/download/attachments/3346087/OpenMRSFormatter.xml?version=1&modificationDate=1282168038000

Credo che dovrebbe essere sufficiente per riprodursi.

Un interessante progetto basato sullo stesso concetto si trova qui: http://code.google.com/p/maven-java-formatter-plugin/

Grazie Misha



1

Usavo Dr. Java per codificare e con un rapido ctrl + A + tab formatta tutto bene con l'evidenziazione della sintassi. L'ho usato su Mac e Windows, non so se supportano Linux. Ed è open source, autonomo e gratuito.


Premendo Tab quando è selezionata una parte qualsiasi del codice, la selezione verrà formattata. DrJava anche una bella scheda interattiva (simile a un interprete).
dansalmo

0

Ho anche usato molto la PrettyPrinter incorporata in JRefactory ( http://jrefactory.sourceforge.net/ ). L'ho scoperto tramite il suo plugin per JEdit. L'ho apprezzato perché aveva la migliore copertura javadoc che abbia mai visto.

Purtroppo sembra morto (nessuna evoluzione dal 2004) e attualmente non supporta Java5.

A proposito confermo che Triemax è una suite commerciale basata su Jalopy open source morto.



0

Jalopy non gestisce dichiarazioni come List stuff <MyClass> ... e commenti lint che iniziano con @

Sono stato in grado di forzare la formattazione cambiando tutto il <MyClass> in LTLTLTMyClassGTGTGT e poi @ in // @ // @ // @ (ripeto solo LT, GT o // @ per assicurarmi che non lo facciano Esistere già. Poi sono stato in grado di Jalopy, e ovviamente devo rimettere tutto a posto come era.

Inoltre, prima di modificare <o> devi assicurarti di non modificare confronti come <= o> = ecc.

Quindi, potresti chiamarla la soluzione dei poveri perché comporta molti passaggi manuali. Se dovessi fare Jalopy più spesso, probabilmente scriverei uno script usando sed che apporterebbe automaticamente quei cambiamenti per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.