Java代码单独格式化/美化/打印的工具?

92
我对了解Java高质量独立源代码格式化工具的可用选择感兴趣。
该格式化工具必须是独立的,即必须支持与任何特定开发环境分离的“批处理”模式。理想情况下,它也应该独立于任何特定操作系统。因此,当前IDE的内置格式化程序在这里没有太大的兴趣(除非该IDE支持批处理模式格式化程序调用,可能是从命令行)。使用闭源C / C ++编写的仅在Windows上运行的格式化程序并不理想,但有些有趣。
要明确的是,“格式化程序”(或“美化程序”)与“样式检查器”不同。格式化程序以源代码作为输入,应用样式规则,并生成与原始源代码在语义上等效的带有样式的源代码。语法修改仅限于修改代码布局,例如更改空格或组织导入语句。很少进行其他重构。样式检查器也应用样式规则,但它仅报告违反规则的情况,而不会生成修改后的源代码作为输出。因此,情况如下:
格式化程序(生成符合样式规则的修改后的源代码)
读取源代码→应用样式规则→编写带有样式的源代码
样式检查器(不生成修改后的源代码)
读取源代码→应用样式规则→编写规则违规情况
进一步澄清:
解决方案必须高度可配置。我希望能够指定自己的样式,而不仅仅是从预设列表中选择。
此外,我不寻求一款用Java编写的通用漂亮打印机,它可以漂亮地打印许多东西。我想为Java代码设计样式。
我也不一定对许多语言的大一统格式化程序感兴趣。我想解决方案可能支持除Java以外的其他语言,但这不是必需的。
此外,仅执行代码突出显示的工具是不行的
我也不感兴趣的是网络服务。我需要一个本地运行的工具。
最后,解决方案不必局限于开源、公共领域、共享软件、免费软件、商业或任何其他形式的许可证。所有形式的许可证都被接受

1
我编写了一个独立的 Helios(Eclipse 3.6),仅用于代码格式化。它只有<13 MB,仅使用 Java。http://openmrs-mailing-list-archives.1560443.n2.nabble.com/cross-platform-cross-IDE-code-formatting-I-believe-it-is-doable-and-halfway-there-td5522493.html#a5522493 - Миша Кошелев
9个回答

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


开源Jalopy和这个网站http://www.triemax.com/products/jalopy/之间有什么关系? - Greg Mattes
看起来这个开源项目已经死了,他们决定采用Triemax生产的商业版本。我很久以前使用Jalopy,我相信是和Ant一起使用的。不妨看看Jacobe。 - Jonathan Holloway
Jacobe不会更新到Java 7,而TIOBE表示它永远不会更新。 - Chris Jones
2
还有 google-java-format - mrts

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。


7

您可能会对Jalopy感兴趣。它可以插入Ant,因此独立于您的IDE。

Astyle也可能很有用。它是开源的(与Jalopy一样),但是用C++编写。它专门针对Java/C/C++格式化,并可以批量处理(通过shell脚本或类似方式)。


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 setting | sed 's/@@' > formatter.asprefs
谢谢 Misha
这是我使用Eclipse 3.6 jars制作的东西。它是Java-only的,命令行式的,并且应该跨平台兼容: 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

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

谢谢, Misha


1

另一个免费在线工具:https://www.tutorialspoint.com/online_java_formatter.htm - There

0

Jalopy无法处理类似于List stuff<MyClass>的语句,以及以@开头的lint注释。

我已经能够通过将所有的<MyClass>更改为LTLTLTMyClassGTGTGT,然后将@更改为//@//@//@(我只是重复LT、GT或//@以确保它们不存在。然后我就可以使用Jalopy了,显然我必须将一切都改回原来的样子。

此外,在更改<或>之前,您必须确保不会更改像<=或>=等比较。

因此,您可能会称其为穷人解决方案,因为它涉及许多手动步骤。如果我经常使用Jalopy,我可能会编写一个使用sed的脚本,自动为我进行这些更改。


0

请查看我们的Java格式化工具,该工具可以处理包括7版本在内的所有Java方言。


0

我曾经使用Dr. Java进行编码,通过快捷键ctrl+A + tab可以使代码格式化并带有语法高亮。我在Mac和Windows上使用过它,不知道是否支持Linux。而且它是开源的、独立的,并且免费。


当选中代码的任何部分时,按Tab键将对选定内容进行格式化。DrJava还具有漂亮的交互式(解释器般的)制表符功能。 - dansalmo
使用版本drjava-beta-2019-220051,这对我没有起作用。 - There

0

我也经常使用JRefactory内置的PrettyPrinter(http://jrefactory.sourceforge.net/)。我是通过它在JEdit中的插件发现它的。我很欣赏它,因为它具有我见过的最好的javadoc覆盖率。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接