Автономный форматировщик кода Java / украшение / красивый принтер? [закрыто]

84

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

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

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

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

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

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

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

Дальнейшие пояснения

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

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

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

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

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

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

Грег Мэттес
источник
1
Я сделал что-то вроде автономного Helios (Eclipse 3.6), который выполняет только форматирование кода. Это <13 МБ, только Java. openmrs-mailing-list-archives.1560443.n2.nabble.com/…
Миша Кошелев

Ответы:

25

JIndent (коммерческий) делает то, что вы хотите:

http://www.jindent.com/

Раньше я также использовал для этого Jalopy, у него открытый исходный код:

http://jalopy.sourceforge.net/

РЕДАКТИРОВАТЬ: Я отмечу, что Jalopy довольно старый и, похоже, в нем нет каких-либо последних обновлений. Я не совсем уверен, будет ли он работать с Java 5/6. Вместо этого вы можете взглянуть на Джейкобе:

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

Здесь, на сайте Роеди Грина, также есть более полный список форматеров:

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

Джон
источник
Какая связь между Jalopy с открытым исходным кодом и этим: triemax.com/products/jalopy
Грег
Похоже, что проект с открытым исходным кодом мертв, и они решили использовать коммерческую версию, созданную Triemax. Прошло много времени с тех пор, как я использовал Jalopy, думаю, это было с Ant. Взгляни вместо этого на Якоби.
Джон
Jacobe не обновляется для Java 7, и TIOBE заявляет, что этого никогда не будет.
Крис Джонс
1
Также есть google-java-format .
мрт
14

Вы также можете запустить программу переформатирования 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.

notnoop
источник
7

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

Также может быть полезен Astyle . Это открытый исходный код (например, Jalopy), но написанный на C ++. Он ориентирован на форматирование Java / C / 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

Спасибо миша


Вот кое-что, что я сделал с помощью jar-файлов Eclipse 3.6. Это командная строка только для Java и кросс-платформенная совместимость:

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

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

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$ 

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

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

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

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

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

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

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

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

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

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

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

Спасибо миша

Миша Кошелев
источник
1

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

Пити Б.
источник
Нажатие табуляции при выделении любой части кода отформатирует выделение. DrJava также является красивой интерактивной вкладкой (как интерпретатор).
dansalmo 03
0

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

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

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

Майкл Зильберманн
источник
0

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

Ира Бакстер
источник
0

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

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

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

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

Процессор
источник