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

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

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

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

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

Прочитать Исходный код → Применить правила стиля → Написать стилизованный исходный код

Проверка стиля (не производит измененный исходный код)

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

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

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

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

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

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

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

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

Ответ 1

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

Ответ 2

Вы также можете запустить переформатирование Eclipse из командной строки.

Вот документация по Eclipse для функции

Сначала вам нужно создать файл конфигурации, соответствующий вашему проекту, с настройками вашего средства форматирования кода Java.

Затем сохраните {projectDirectory}/.settings/org.eclipse.jdt.core.prefs в другом месте.

Теперь вы позвоните в форматер.

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

[ПРЕДУПРЕЖДЕНИЕ] Это, кажется, перестало работать в Eclipse 2018. Используйте Eclipse Oxygen.

Ответ 3

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

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

Ответ 4

ОБНОВЛЕНИЕ: По моему новому пониманию, основанному на некорректном отчете об ошибке, я подал: 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

Существует оболочка script, которая использует пакетный файл 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/

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

Ответ 5

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

Jalopy не обрабатывает выражения, такие как List stuff <MyClass> ... и комментарии lint, начинающиеся с @

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

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

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