Автономный Java-код форматирования / beautifier / красивый принтер?

Мне интересно узнать о доступных вариантах высококачественных автономных форматировщиков исходного кода для Java.

Форматировщик должен быть автономным, то есть он должен поддерживать «пакетный» режим, который отделен от какой-либо конкретной среды разработки . В идеале он должен быть независим от какой-либо конкретной операционной системы . Таким образом, встроенный форматтер для IDE du jour здесь малоинтересен (если только эта IDE не поддерживает вызов форматирования пакетного режима, возможно, из командной строки). Форматировщик, написанный в C / C ++ с закрытым исходным кодом, который работает только, скажем, в Windows, не идеален, но несколько интересен.

Чтобы быть ясным, «форматирующий» (или «украшатель») не совпадает с «проверкой стиля». Форматтер принимает исходный код в качестве входных данных, применяет правила стилизации и создает стильный исходный код, который семантически эквивалентен исходному исходному коду. Синтаксические модификации ограничены такими вещами, как изменение макета кода, как при изменении пробелов, или организация import заявлений. Очень мало, если таковые имеются, выполняется другой рефакторинг. Элемент проверки стиля также применяет правила стилизации, но он просто сообщает о нарушениях правил, не производя модифицированный исходный код в качестве вывода. Таким образом, картина выглядит так:

Formatter (производит модифицированный исходный код, который соответствует правилам стилизации)

Читать исходный код → Применить правила стилизации → Создать стилизованный исходный код

Style Checker (не создает модифицированный исходный код)

Читать исходный код → Применить правила стилизации → Записать правила нарушения правил

Дальнейшие разъяснения

Решения должны быть очень настраиваемыми. Я хочу иметь возможность указать свой собственный стиль, а не просто выбирать из списка предустановок.

Кроме того, я не ищу широкоформатный принт общего назначения, написанный на Java, который может печатать много вещей. Я хочу создать код Java.

Я также не обязательно интересуюсь грандиозным форматированием для многих языков. Я полагаю, было бы неплохо, если бы решение поддерживало языки, отличные от Java, но это не является обязательным требованием.

Кроме того, инструменты, которые выполняют только подсветку кода, являются правильными .

Меня также не интересует веб-сервис. Я хочу инструмент, который я могу запустить локально.

Наконец, решения не должны ограничиваться открытым исходным кодом, общественным достоянием, условно-бесплатным, свободным программным обеспечением, коммерческим или чем-либо еще. Все формы лицензирования приемлемы .

JIndent (Commercial) делает то, что вы хотите:

http://www.jindent.com/

Я также использовал Jalopy в прошлом, чтобы сделать это, это с открытым исходным кодом:

http://jalopy.sourceforge.net/

EDIT: Я буду замечать, что Jalopy довольно старый, и, похоже, никаких недавних обновлений для него нет. Я не совсем уверен, что он будет работать с Java 5/6. Возможно, вам захочется взглянуть на Якобе:

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

Здесь также есть более полный список форматировщиков на сайте Roedy Green:

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

Вы также можете запустить Eclipse reformatter из командной строки. Проверьте эту запись в блоге

Может быть интересен Jalopy . Он подключается к Ant и, следовательно, не зависит от вашей среды разработки.

Астиль также может быть полезен. Это открытый исходный код (например, Jalopy), но написанный на C ++. Он ориентирован на форматирование Java / C / C ++ и может управляться пакетом (через сценарии оболочки или аналогичные)

ОБНОВЛЕНИЕ: По моему новому пониманию, основанному на неправильном отчете об ошибке, который я подал: https://bugs.eclipse.org/bugs/show_bug.cgi?id=325289 Файл OpenMRSFormatter.xml фактически должен быть файлом настроек, а не XML файл.

Вы можете найти такой файл здесь: https://bugs.eclipse.org/bugs/attachment.cgi?id=178874

или конвертировать любой экспортированный XML-файл форматирования: cat formatter.xml | grep настройка | sed ‘s / @@’> formatter.asprefs

Спасибо, Миша


Вот что я сделал с использованием Eclipse 3.6 jars. Это Java-only, командная строка и должна быть совместима с кросс-платформенными:

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

Существует сценарий оболочки, который использует пакетный файл OpenMRSCodeFormatter.xml. Выход образца:

 [email protected]:~/openmrs-code-formatter$ cat ../Test.java public class Test { public a() { System.out.println("! I did not format this right!"); } }[email protected]:~/openmrs-code-formatter$ ./format.sh ../Test.java Configuration Name: OpenMRSFormatter.xml Starting format job ... Done. cat ../[email protected]:~/openmrs-code-formatter$ cat ../Test.java public class Test { public a() { System.out.println("! I did not format this right!"); } }[email protected]:~/openmrs-code-formatter$ 

Это основано на сообщении здесь: http://www.peterfriese.de/formatting-your-code-using-the-eclipse-code-formatter/

Поскольку я не знаю, как долго будет оставаться связь, я опишу содержание ниже.

Это основано на распространении Eclipse 3.6 Helios. Я использовал один для Linux x86, но он должен работать для любой версии, поскольку я не использовал никаких (насколько мне известно) JAR-файлов конкретной платформы.

Содержимое tar-архива:

 [email protected]:~$ 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 

Соответствующие баны в каталоге плагинов берутся непосредственно из каталога плагинов Eclipse 3.6.

Содержимое config.ini:

 [email protected]:~$ more openmrs-code-formatter/configuration/config.ini osgi.bundles=reference\:file\:[email protected]\:start org.eclipse.equinox.simpleconfigurator.configUrl=file\:org.eclipse.equinox.simpleconfigurator/bundles.info eclipse.application=org.eclipse.jdt.core.JavaCodeFormatter 

format.sh:

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

и OpenMRSFormatter.xml можно найти здесь: http://wiki.openmrs.org/download/attachments/3346087/OpenMRSFormatter.xml?version=1&modificationDate=1282168038000

Я считаю, что этого достаточно, чтобы воспроизвести.

Интересный проект, основанный на той же концепции, можно найти здесь: http://code.google.com/p/maven-java-formatter-plugin/

Спасибо, Миша

Попробуйте «Jacob Code Beautifier»:

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

Личное издание бесплатное.

Раньше я использовал д-р Java для ввода кода и с быстрой вкладкой ctrl + A +, он форматирует все это с подсветкой синтаксиса. Я использовал его на Mac и Windows, не знаю, поддерживают ли они Linux. И это открытый исходный код, автономный и бесплатный.

Я также использовал много PrettyPrinter, встроенный внутри JRefactory ( http://jrefactory.sourceforge.net/ ). Я открыл его через свой плагин для JEdit. Я оценил это, поскольку у меня был лучший охват javadoc, который я когда-либо видел.

К сожалению, он кажется мертвым (без развития с 2004 года), и на самом деле он не поддерживает Java5.

Кстати, я подтверждаю, что Triemax – коммерческий пакет, основанный на мертвом открытом Jalopy с открытым исходным кодом.

См. Наш Java Formatter для инструмента, который обрабатывает все диалекты Java, включая версию 7.

Jalopy не обрабатывает выражения типа List … и комментарии lint, начиная с @

Я смог заставить его форматировать, изменив все на LTLTLTMyClassGTGTGT, а затем @ на // @ // @ // @ (я просто повторяю LT, GT или // @, чтобы убедиться, что они не Я уже был в состоянии сделать Jalopy, и, очевидно, мне нужно все заменить на то, что было.

Кроме того, перед изменением <или> вам нужно убедиться, что вы не измените сравнение, например, <= или> = и т. Д.

Таким образом, вы можете назвать это решением бедного человека, потому что оно включает в себя много ручных шагов. Если бы я чаще делал Jalopy, я бы, вероятно, написал сценарий с помощью sed, который автоматически изменил бы эти изменения для меня.

Давайте будем гением компьютера.