從命令列格式化 Java 程式碼
1. 概述
儘管能夠在整合開發環境 (IDE) 中格式化程式碼,但我們可能希望使用命令列格式化程式來自動執行格式化程式碼的過程。因此,即使開發人員眾多、程式碼庫龐大,我們也能保證使用相同的程式碼風格。
在本教程中,我們將討論從命令列格式化 Java 程式碼。我們將在 Linux 中運行範例,但我們將討論的格式化程式也可在 Windows 等其他作業系統中使用。
2. 範例程式碼
我們將使用簡單的「Hello World」程式的未格式化版本:
public class HelloWorld
{
public static void main( String[] args )
{
System.out.println(
"Hello World!")
;
} }
這段程式碼的格式有幾個問題:
- 程式碼縮排不正確
- 有多餘的空白,例如
static void - 以
System.out.println開頭的表達式跨越多行 - 類別和方法的右大括號位於同一行
此外,我們更喜歡將起始花括號附加到啟動類別或方法的行的末尾,而不是在新行上。
首先我們測試一下未格式化的程式碼是否可以編譯執行:
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
程式按預期編譯並運行。
3.使用astyle
astyle (藝術風格)是一種原始碼格式化程序,支援多種語言,包括 Java 。我們將要使用的astyle版本是3.6.3 。下載後,我們可以用它來格式化HelloWorld.java :
$ astyle --squeeze-ws --style=java HelloWorld.java
Formatted /home/baeldung/projects/formatter/HelloWorld.java
–squeeze-ws選項刪除多餘的空格。 –style=java選項指定使用附加大括號。最後,我們傳遞了輸入檔HelloWorld.java 。我們可以傳遞多個文件。它也可以遞歸地處理目錄。
讓我們檢查一下格式化後的HelloWorld.java的內容:
$ cat HelloWorld.java
public class HelloWorld {
public static void main( String[] args ) {
System.out.println(
"Hello World!")
;
}
}
現在,原始程式碼已採用適當的縮排進行格式化。 astyle預設使用 4 個空格的縮排。沒有多餘的空間。每個右大括號都位於一個新行上。
然而,以System.out.println開頭的表達式仍然佔據三行。
astyle提供了更多選項,可以自訂 Java 和其他語言的原始碼格式。
4. 使用google-java-format
google-java-format是從命令列格式化 Java 程式碼的另一個選項。它使用Google Java Style格式化原始碼。我們也可以將它用作IntelliJ和Eclipse等 IDE 中的插件。
我們將使用的google-java-format版本是1.24.0 。一旦我們下載了相應的jar文件,我們就可以使用java運行它:
$ java -jar ./google-java-format-1.24.0-all-deps.jar -r HelloWorld.java
-r選項指定以格式化版本取代輸入檔。否則, google-java-format將輸出傳送到stdout 。我們在-r選項之後傳遞了要格式化的輸入檔HelloWorld.java 。可以格式化多個文件。它還可以處理目錄中的檔案。
讓我們檢查一下格式化後的HelloWorld.java的內容:
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
從輸出中可以明顯看出, google-java-format正確格式化了原始程式碼,並消除了我們之前列出的所有格式問題。 Google Java 樣式預設使用 2 個空格縮排。
google-java-format有許多其他選項。我們可以使用-h選項列出它們。
5.使用idea.sh format
IntelliJ 是一種用於開發 Java 應用程式的熱門 IDE。通常,我們會使用 IntelliJ 提供的 shell 腳本idea.sh來啟動 IDE。但是,當我們與format關鍵字一起運行時,我們也可以從命令列格式化原始程式碼,即idea.sh format :
$ idea.sh format -allowDefaults HelloWorld.java
...
Formatting /home/baeldung/projects/formatter/HelloWorld.java...OK
1 file(s) scanned.
1 file(s) formatted.
由於輸出太長,我們已將其截斷。命令列格式化程式啟動 IntelliJ IDE 的實例並格式化原始碼。因此,如果我們運行另一個 IntelliJ 實例,它就會失敗。
-allowDefaults**選項使用預設的程式碼樣式設定**。我們在此選項之後傳遞了要格式化的檔案HelloWorld.java 。可以格式化多個檔案和目錄中的檔案。
讓我們檢查一下格式化後的HelloWorld.java的內容:
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println(
"Hello World!")
;
}
}
除了以System.out.println開頭的語句之外,所有格式問題似乎都已消失。它仍然佔據三行。
當未定義程式碼樣式或檔案不屬於專案時,**使用-allowDefaults**選項會很有幫助。但是,也可以使用-s選項指定其他代碼樣式設定。在這種情況下我們可以使用專案目錄中的程式碼風格設定。
如果我們使用-s選項使用其他程式碼樣式設置,我們可以透過在程式碼樣式設定檔中將ij_java_keep_line_breaks選項設為false來關閉保留換行符:
ij_java_keep_line_breaks = false
除了-allowDefaults和-s選項之外, idea.sh format還支援其他選項。
6. 使用 Eclipse 的 Formatter 應用程式
Eclipse 是另一種用於開發 Java 應用程式的流行 IDE。就像 IntelliJ 一樣,Eclipse 也支援從命令列格式化原始碼:
$ eclipse -noSplash -data /home/baeldung/eclipse-workspace -application org.eclipse.jdt.core.JavaCodeFormatter -config org.eclipse.jdt.core.prefs HelloWorld.java
...
Configuration Name: org.eclipse.jdt.core.prefs
Starting format job ...
Done.
我們已經截斷了輸出,因為它很長。 -noSplash選項用於停用啟動畫面。格式化程式需要工作空間,因此我們使用-data選項傳遞工作空間目錄。在我們的範例中,它是/home/baeldung/eclipse-workspace 。
我們指定使用-application org.eclipse.jdt.core.JavaCodeFormatter選項來執行格式化程式。如果我們正在執行另一個 Eclipse 實例,則執行格式化程式會失敗。
最後一個選項是-config選項。我們使用-config選項來指定格式化程式應用程式的設定檔。該檔案可以透過 Eclipse IDE 中 Java 專案的程式碼格式化程式設定建立。另一種選擇是複製並使用現有的設定檔。
我們在範例中使用了org.eclipse.jdt.core.prefs設定檔。我們將設定檔中的org.eclipse.jdt.core.formatter.tabulation.char參數設為space ,以使用空格而不是製表符進行縮排:
org.eclipse.jdt.core.formatter.tabulation.char=space
最後,我們傳遞了要格式化的檔案HelloWorld.java 。我們可以指定多個來源檔案或目錄。
讓我們檢查一下格式化後的HelloWorld.java的內容:
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
從輸出中可以明顯看出, Eclipse 的格式化程式應用程式正確地格式化了原始程式碼,並消除了我們之前列出的所有格式化問題。
七、結論
在本文中,我們討論了在 Linux 中透過命令列格式化 Java 程式碼。我們在範例中使用了「Hello World」程式的未格式化版本。
首先,我們檢查了astyle 。它不僅支援Java,還支援C、C++等其他語言。
其次,我們檢查了google-java-format ,它格式化 Java 程式碼以符合 Google Java 風格。它可以用作命令列程式和多個 IDE 中的插件。
然後,我們看到兩個流行的 IDE IntelliJ 和 Eclipse 也提供了格式化 Java 程式碼的命令列工具。我們了解到,我們需要執行idea.sh format指令來執行 IntelliJ 的格式化程式。同樣,我們將org.eclipse.jdt.core.JavaCodeFormatter應用程式與eclipse一起使用,從命令列執行 Eclipse 的程式碼格式化程式。