使用 Scala-CLI 建立簡單的 Java 應用程式
一、簡介
我們只需安裝一個 Java 就可以獨立建立和執行一個簡單的 Java 類別。然而,包含第三方依賴項通常需要 Maven 或 Gradle 等建置工具,這對於小型且簡單的 Java 應用程式來說可能很麻煩。將 Java 應用程式打包為可執行檔還需要向這些建置工具新增外掛程式或使用單獨的工具。
幸運的是,我們可以使用名為 Scala-CLI 的實用 Scala 工具來簡化小型專案的 Java 應用程式開發。在本教程中,我們將探索 Scala-CLI 的功能以及如何使用它來執行編譯、建置、打包和使用特定 JDK 等任務。
2.什麼是Scala-CLI?
Scala-CLI 是一個命令列工具,主要用於建立 Scala 應用程式。它簡化了 Scala 應用程式的編譯、運行和打包,消除了對綜合建置系統的需求。
有趣的是,Scala-CLI 還可以建立純 Java 應用程序,利用其全部功能來簡化開發。
3. 設定
Scala-CLI可以依照官網提供的說明進行安裝。我們可以使用以下命令來驗證安裝是否成功:
scala-cli --version
如果安裝成功,它會將scala-cli
版本列印到控制台。
此外,我們可以在 VS Code Editor 中安裝Metals擴充功能以在 IDE 中運作。 Scala-CLI 不需要在電腦上預先安裝 JDK,因為它可以自行管理 JDK。
但是,有時可能會與其他 Java 外掛程式發生衝突。如果 VS Code 中出現錯誤回報問題,我們可能需要暫時停用其他 Java 擴充功能。
我們還將為本教學課程建立一個名為scala-cli
的基本目錄,其中保存與本教學相關的所有檔案。
4.Hello World 程序
按照慣例,讓我們從一個簡單的Hello World
程式開始。首先,我們可以在基本目錄下建立一個新的hello-world
目錄。接下來,讓我們使用以下程式碼在此目錄中建立一個名為HelloWorld.java
的檔案:
package com.baeldung;
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello, World!");
}
}
我們可以使用以下命令來執行這個簡單的 Java 類別:
scala-cli HelloWorld.java
第一次運行時,它會下載運行所需的庫。如果沒有安裝JDK,Scala-CLI會自動下載Open JDK並使用它進行編譯。如果已有一個可用,則它使用該特定的 JDK。在撰寫本文時,Scala-CLI 使用 JDK 17 作為預設版本。但是,它將來可能會升級到新版本。之後,它運行此類並將給定文字列印到控制台:
如果我們在 VS Code 中開啟此目錄,我們可能會看到編譯錯誤並且需要適當的導航功能。在這種情況下,VS Code 可能能夠應用導航和程式碼完成;但是,當我們使用第三方依賴項時,它不會解決它們。為了支援它,我們可以使用hello-world
目錄中的指令為 Metals 外掛程式建立必要的元資料:
scala-cli setup-ide .
這會產生 Metals 插件所需的進階功能所需的元資料。
Metals 外掛程式也提供了一個工具提示,可以直接從 VS Code IDE 運行主類別:
我們可以單擊運行操作,它就會執行程式。
5. 指令
在上一節中,我們使用 Scala-CLI 運行了一個簡單的程式。但是,使用java
命令也可以完成相同的操作,並且不需要其他工具。現在,讓我們來看看 Scala-CLI 的一些最有用的功能。
指令是在 Scala-CLI 中具有特殊意義的元資料設定。這些指令以特殊語法 //> 開頭。它們必須放在任何 Java 程式碼之前,甚至放在 package 語句之前。在本節中,我們將探討 Scala-CLI 中一些有用的指示。
5.1.指定Java版本
在前面的範例程式碼中,我們沒有指定任何Java版本,它使用預設的JDK或已安裝的JDK來執行。但是,我們可以配置我們希望程式碼使用的特定版本的 JDK。為此,我們使用jvm
指令。
讓我們寫一個使用Directives.java
21 的範例scala-cli/jdk-config
碼。
//> using jvm 21
package com.baeldung;
record Greet(String name){};
public class Jdk21Sample {
public static void main(String args[]) {
var greet = new Greet("Baeldung");
var greeting = "Hello, " + greet.name();
System.out.println(greeting);
}
}
請注意指令jvm
與所需版本的 JDK 一起使用。這意味著 Scala-CLI 使用 JDK 21 來執行整個檔案。
預設使用指定版本的Adoptium Open JDK。我們也可以在指令中明確選擇其他版本的 JDK。例如,要使用 Zulu JDK,我們可以使用指令:
//> using jvm zulu:21
當我們執行此指令時,Scala-CLI 將下載 Zulu JDK 並使用它執行程式。無需任何手動設置,我們就可以輕鬆地在不同的JDK之間切換並執行程式。在底層,Scala-CLI 使用工具 Coursier 來管理相依性和 JDK 版本。
5.2.傳遞Javac
選項和 Java 屬性
我們可以使用指令將 Java 選項傳遞給編譯器。讓我們來看一個例子:
//> using jvm 21
//> using javaOpt -Xmx2g, -DappName=baeldungApp, --enable-preview
//> using javaProp language=english, country=usa
//> using javacOpt --release 21 --enable-preview
public class JavaArgs {
public static void main(String[] args) {
String appName = System.getProperty("appName");
String language = System.getProperty("language");
String country = System.getProperty("country");
String combinedStr = STR."appName = \{ appName } , language = \{ language } and country = \{ country }";
System.out.println(combinedStr);
}
}
上面的程式碼傳遞了三種不同類型的選項。我們可以使用指令javaOpt
來傳遞 JVM 參數,例如-Xmx
或系統屬性。同樣,我們可以使用javacOpt
將選項傳遞給編譯過程中使用的javac
編譯器。此外,我們也可以使用指令javaProp
將 Java 屬性傳遞給應用程式。
這些指令允許直接在主 Java 類別中配置和控制參數。
5.3.管理外部依賴關係
我們可以使用指令dep
管理外部相依性。為了演示這一點,讓我們添加一個簡單的庫。我們可以建立一個名為DependencyApp.java
的新檔案並貼上以下內容:
//> using dep com.google.code.gson:gson:2.8.9
import com.google.gson.JsonParser;
import com.google.gson.JsonElement;
public class DependencyApp {
public static void main(String args[]) {
String jsonString = "{\"country\": \"Germany\", \"language\": \"German\", \"currency\": \"Euro\"}";
var countryJson = JsonParser.parseString(jsonString);
var country = countryJson.getAsJsonObject().get("country").getAsString();
System.out.println("Selected country: " + country);
}
}
在上面的程式碼中,我們使用指令dep
添加了 Google Gson 的依賴項。 Scala-CLI 使用 gradle 樣式語法進行依賴關係定義。
當我們執行 t 程式碼時,我們得到的輸出為:
Compiled project (Java)
[hint] ./DependencyApp.java:1:15
[hint] "gson is outdated, update to 2.11.0"
[hint] gson 2.8.9 -> com.google.code.gson:gson:2.11.0
[hint] //> using dep com.google.code.gson:gson:2.8.9
[hint] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Selected country: Germany
我們可以觀察到 Scala-CLI 可以偵測程式庫版本,並在有新版本可用時建議更新。此功能可以方便地維護最新的依賴項,而無需手動搜尋 Maven 中央儲存庫。
6. 將 Java 應用程式打包為可執行文件
Scala-CLI 最有價值的功能之一是它能夠直接從程式碼建立可執行應用程序,而不需要額外的插件。讓我們探索使用先前建立的檔案DependencyApp.java
來建立一個可執行應用程式。
我們可以使用以下命令來建立可執行檔:
scala-cli --power package DependencyApp.java -o myApp --assembly
package
指令建立一個套件。 –power
標誌表示這是一個進階使用者命令。我們可以使用參數-o
指定可執行應用程式名稱。如果我們包含–assembly
標誌,Scala-CLI 將創建一個可執行的 JAR;否則,它會建立一個庫 JAR。
當我們使用組件標誌並將其包裝在獨立腳本中時,Scala-CLI 預設會建立一個可執行 JAR。若要執行已建立的套件,請使用以下命令:
./myApp
我們可以透過傳遞附加標誌來產生一個簡單的 JAR,而不是建立包裝器可執行檔。
scala-cli --power package DependencyApp.java -o myApp.jar --assembly --preamble=false
現在,我們可以執行如下:
java -jar myApp.jar
同樣,Scala-CLI 允許我們建立 Docker 映像、GraalVM 本機映像以及特定於平台的格式,例如deb
、 msi
等。
七、結論
在本文中,我們探討了 Scala-CLI(一個類似 JBang 的工具)的幾個關鍵功能。 Scala-CLI 在強調 Scala 的同時,也為 Java 應用程式提供了強大的支援。我們演示了 Scala-CLI 如何透過簡化應用程式建置的各個方面、提供輕鬆的客製化、支援不同的打包格式等來簡化開發。
與往常一樣,本教程中使用的範例程式碼可在 GitHub 上取得。