【问题标题】:Stand-alone Java code formatter/beautifier/pretty printer? [closed]独立的 Java 代码格式化程序/美化器/漂亮的打印机? [关闭]
【发布时间】:2010-11-03 01:21:42
【问题描述】:

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

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

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

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

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

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

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

进一步说明

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

另外,我不是在寻找可以漂亮打印很多东西的general purpose pretty-printer written in Java。我想为 Java 代码设置样式。

我也不一定对许多语言的grand-unified formatter感兴趣。我认为支持 Java 以外的语言的解决方案可能会很好,但这不是必需的。

此外,tools that only perform code highlightingright out

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

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

【问题讨论】:

标签: java coding-style code-formatting


【解决方案1】:

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和这个有什么关系:triemax.com/products/jalopy
  • 看起来开源项目已经死了,他们决定使用由 Triemax 生产的商业版本。我已经很久没有使用 Jalopy 了,我相信它是用 Ant 的。看看雅各布吧。
  • Jacobe 没有针对 Java 7 进行更新,TIOBE 表示永远不会。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我曾经使用Dr. Java 进行编码,并且通过快速的 ctrl+A + tab 可以很好地格式化所有内容并突出显示语法。我在 Mac 和 Windows 上使用过,不知道它们是否支持 linux。而且它是开源的、独立的、免费的。

    【讨论】:

    • 在选择代码的任何部分时按选项卡将格式化选择。 DrJava 也是一个不错的交互式(类似解释器)选项卡。
    • 这对我使用 drjava-beta-2019-220051 版本不起作用
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      您也可以从命令行运行 Eclipse 重新格式化程序。

      这里是Eclipse documentation of the feature

      首先你必须create configuration file specific to your project of your Java code formatter settings.

      然后将{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。

      【讨论】:

        【解决方案6】:

        试试“Jacobe Code Beautifier”:

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

        个人版是免费的。

        【讨论】:

        【解决方案7】:

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

        你可以在这里找到这样的文件: https://bugs.eclipse.org/bugs/attachment.cgi?id=178874

        或转换任何 XML 导出的格式化程序文件: 猫格式化程序.xml | grep 设置 | sed 's/@@' > formatter.asprefs

        谢谢 米莎


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

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

        有一个使用捆绑的 OpenMRSCodeFormatter.xml 文件的 shell 脚本。示例输出:

        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 目录中的相关 jars 直接取自 Eclipse 3.6 plugins 目录。

        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/

        谢谢 米莎

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            Jalopy 不处理 List stuff ... 和以 @ 开头的 lint cmets 之类的语句

            我已经能够通过将所有 更改为 LTLTLTMyClassGTGTGT 然后将 @ 更改为 //@//@//@ 来强制它格式化(我只是重复 LT、GT 或 //@ 以确保它们还不存在。然后我就可以使用 Jalopy 了,显然我必须将所有东西都替换回原来的样子。

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-28
              • 2021-09-19
              • 2012-03-07
              • 2011-01-07
              • 1970-01-01
              • 2023-02-19
              • 2010-09-17
              相关资源
              最近更新 更多