独立的Java代码格式化程序/美化/漂亮的打印机?

时间:2009-06-15 15:08:00

标签: java coding-style code-formatting

我有兴趣了解适用于Java的高质量,独立源代码格式化程序的可用选择。

格式化程序必须是独立的,也就是说,它必须支持decoupled from any particular development environment“批处理”模式。理想情况下,它应该独立于任何特定的操作系统。因此,IDE du jour的内置格式化程序在这里没有什么意义(除非该IDE支持批处理模式格式化程序调用,可能来自命令行)。用闭源C / C ++编写的格式化程序只能在Windows上运行,这并不理想,但有点有趣。

要清楚,“格式化程序”(或“美化”)与“样式检查程序”不同。格式化程序接受源代码作为输入,应用样式规则,并生成样式源代码在语义上等同于原始源代码。语法修改仅限于修改代码布局,如更改空格或组织import语句。如果有的话,很少进行其他重构。样式检查器也应用样式规则,但它只是报告规则违规而不生成修改后的源代码作为输出。所以图片看起来像这样:

格式化程序(生成符合样式规则的修改后的源代码)

阅读源代码→应用样式规则→编写样式源代码

样式检查器(不生成修改后的源代码)

阅读源代码→应用样式规则→编写规则违规

进一步澄清

解决方案必须具有高度可配置性。我希望能够指定自己的风格,而不是简单地从预设列表中选择。

另外,我没有找到可以打印很多东西的general purpose pretty-printer written in Java 。我想设置Java代码的样式。

对于许多语言,我 对<{3}} 感兴趣。我认为解决方案支持Java以外的语言可能会很好,但这不是必需的。

此外, grand-unified formattertools that only perform code highlighting right

我也对网络服务不感兴趣。我想要一个可以在本地运行的工具。

最后,解决方案不必局限于开源,公共领域,共享软件,自由软件,商业或其他任何东西。 可接受所有形式的许可

9 个答案:

答案 0 :(得分:25)

JIndent(商业)做你想做的事:

http://www.jindent.com/

我过去也使用过Jalopy来做这件事,它是开源的:

http://jalopy.sourceforge.net/

编辑:我会注意到Jalopy相当陈旧,似乎没有最新的更新。我不太确定它是否适用于Java 5/6。你可能想看一下Jacobe:

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

在Roedy Green的网站上还有一个更完整的格式化列表:

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

答案 1 :(得分:14)

您还可以从命令行运行Eclipse重新格式化程序。查看this blog entry

答案 2 :(得分:6)

Jalopy可能会引起关注。它将插入Ant,因此独立于您的IDE。

Astyle也可能有用。它是开源的(如Jalopy),但是用C ++编写。它适用于格式化Java / C / C ++,可以批量驱动(通过shell脚本或类似方法)

答案 3 :(得分:4)

更新:根据我提交的错误错误报告的新理解:https://bugs.eclipse.org/bugs/show_bug.cgi?id=325289 OpenMRSFormatter.xml文件实际上必须是首选项文件而不是XML文件。

您可以在此处找到此类文件: https://bugs.eclipse.org/bugs/attachment.cgi?id=178874

或转换任何XML导出的formatter文件: cat formatter.xml | grep设置| sed's / @@'&gt; formatter.asprefs

谢谢 米莎


这是我使用Eclipse 3.6 jar制作的内容。它只是Java,命令行,应该是跨平台兼容的:

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

有一个shell脚本使用捆绑的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

plugins目录中的相关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/

谢谢 米莎

答案 4 :(得分:1)

我曾经使用Dr. Java来编写代码并使用快速的ctrl + A +标签,它可以很好地格式化语法高亮。我已经在Mac和Windows上使用它,不知道它们是否支持Linux。它是开源的,独立的,免费的。

答案 5 :(得分:1)

尝试“Jacobe Code Beautifier”:

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

个人版是免费的。

答案 6 :(得分:0)

我还在JRefactory(http://jrefactory.sourceforge.net/)中嵌入了很多PrettyPrinter。我通过它的JEdit插件发现了它。我很感激,因为它有更好的javadoc覆盖率。

不幸的是它似乎死了(自2004年以来没有进化),实际上它不支持Java5。

顺便提一下,我确认Triemax是基于死开源Jalopy的商业套件。

答案 7 :(得分:0)

请参阅我们的Java Formatter以获取处理所有Java方言的工具,包括版本7。

答案 8 :(得分:0)

Jalopy不处理List stuff&lt; MyClass&gt;等语句。 ...和以@

开头的lint评论

我已经能够通过更改所有&lt; MyClass&gt;强制它进行格式化。进入LTLTLTMyClassGTGTGT然后@进入// @ // @ // @(我只是重复LT,GT或// @以确保它们不存在。然后我能够使用Jalopy,显然我有把一切都改回原来的样子。

此外,在更改&lt;或者&gt;你必须确保你不会像&lt; =或&gt; =等那样改变比较。

所以,你可以称之为穷人解决方案,因为它涉及许多手动步骤。如果我更频繁地做Jalopy,我可能会使用sed编写一个脚本来自动为我做这些更改。