VSCode 優勢
VSCode 的遠端連線、第三方支援,遠比 NetBeans 更好,所以建議使用 VSCode 進行 Java 程式開發。
OpenJDK
首先到 https://learn.microsoft.com/en-us/java/openjdk/download 下載 OpenJDK 21 版本並安裝。
安裝 VSCode
請先到 https://code.visualstudio.com/Download 下載 System installer 版本並安裝。
Extension 擴充包
VSCode 預設並不支援 Java,所以需由 Extension 下載 Extension pack for Java 及 Gradle for Java 二個擴充包。安裝 Extension pack for Java 時,會自動下載 Gradle for Java。
編譯自訂 SDK
假設我們的自訂 sdk 目錄如下
project/ ├─ src/ │ └─ net/ │ └─ ddns/ │ └─ mahaljsp/ │ ├─ np.java │ ├─ os.java │ └─ mysql/ │ ├─ mysql.java │ ├─ PyConnection.java
在 Power Shell (VSCode Terminal) 執行如下指令,將 sdk 打包成 mahaljsp .jar,然後置於 lib 之下。
Get-ChildItem -Recurse -Filter *.java src | % { $_.FullName } > sources.txt
$sources = Get-Content sources.txt
javac -d out $sources
jar cvf lib/mahaljsp.jar -C out .
javac -d out $sources 就是把所有的 java 都編譯成 .class,然後置於專案下的 out 目錄。
jar 的「-C out」是指要切進 out 目錄中,然後「.」是指 out 裏所有的檔案。
在 Linux 下可使用如下指令
javac -d out $(find src -name "*.java") jar cvf ./lib/mahaljsp.jar -C out .
jar 在作什麼
jar 就是在 out 裏新增 META-INF 目錄,然後在裏面新增 MANEFEST.MF 檔案。
MANEFEST.MF 檔案內容如下
Manifest-Version: 1.0 Created-By: 21.0.10 (Microsoft)
然後將 out 內的所有檔案及目錄選取,壓縮成 mahaljsp.zip 檔,然後將副檔名 .zip 改成 .jar 檔。
注意上述的 sdk,就算沒有 META-INF 一樣可以使用。
Ant 專案
VSCode 預設就是使用 Ant 模式開啟專案,執行時會在指令上打上所有參數,適用於單一檔案或不複雜的專案。
實際的專案中,最好在專案下新增 src 及 lib,然後把 .java 程式碼寫在 src 之內。
project/ ├─ src/ └─ lib/
使用 jar
在 VSCode 開啟新 Folder,然後在專案下新增 src 及 lib 二個目錄。把 上述自訂sdk mahaljsp.jar copy 到 lib 目錄下。
然後在 src 裏增 C01.java,就可以使用自訂 SDK 類別,如下所示
import net.ddns.mahaljsp.np;
import net.ddns.mahaljsp.os;
public class C01{
public static void main(String[] args){
int[] d=np.random.randint(1, 100, 10);
os.print(d);
}
}
無論是在 Windows 或 Linux,輸入如下指令執行程式。
cd src
java -cp "../lib/*" C01.java
或是
cd src
javac -d ../out -cp "../lib/*" C01.java
cd out
java -cp ".;./lib/*" C01
在Windows 下,「.;」 是在目前的目錄找 .class,然後去「./lib/*」找其它的 .class 及 .jar。沒有「.;」無法執行。
在 Linux 下必需使用「.:./lib/*」執行,如下所示
java -cp ".:./lib/*" C02
Gradle 專案
專案由多個 .java 檔案組成,並且引用多個 .jar 套件時,通常會形成較為複雜的編譯與相依性管理需求,此時需使用 Gradle 進行建置與依賴管理,提升開發效率與專案可維護性。
安裝 Gradle
https://gradle.org/releases/ 下載最新 Gradle 版本 binary-only。解開後改名為 gradle,置於 c:\ 之下,然後將 C:\gradle\bin 設定於系統 path 變數中。
VSCode 擴充包
VSCode Extension 需安裝 Gradle for Java,然後 Ctrl+Shift+p,選取 Create Java Project,再選取Groovy
開啟專案
Ctrl + Shift + p,選取 Java: Create Java Project,再選取 Gradle,然後指定目錄,比如 e:\java\gradle\mix,再選取 Groovy,然後專案名直接按 enter。
AppTest 錯誤
請將 src\test\mava\mix 下的 AppTest.java 刪除
快速鍵
Ctrl+Shift+p / Task: Run Task / +Configure a Task Gradle Run,輸入如下指令
{
"version": "2.0.0",
"tasks": [
{
"label": "Gradle Run",
"type": "shell",
"command": "./gradlew run",
"group": "build",
"problemMatcher": []
}
]
}
然後 Ctrl+Shift+p /Open Keyboard shurtcuts(JSON),加入如下
{
"key": "shift+f7",
"command": "workbench.action.tasks.runTask",
"args": "Gradle Run"
}
build.gradle
app 之下的 build.gradle 是個很重要的設定檔,完整的設定檔如下
plugins {
id 'application'
id 'com.gradleup.shadow' version '9.4.1'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation libs.junit.jupiter
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation libs.guava
implementation("com.mysql:mysql-connector-j:8.4.0")
implementation files('libs/mahaljsp.jar')
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
application {
mainClass = 'net.ddns.mahaljsp.mix.App'
}
tasks.named('test') {
useJUnitPlatform()
}
jar {
manifest {
attributes( 'Main-Class': 'net.ddns.mahaljsp.mix.App' )
}
}
shadow
打包成 jar 時,能自動打包含 libs 的 jar 及 dependencies 指定的 lib。
dependencies
dependencies 裏面的設定,會自動上網下載所需的 lib,比如 mysql driver,會下載到 C:\Users\登入者\.gradle\caches\modules-2\files-2.1\com\mysql 之下。
libs/mahaljsp.jar 則是自行撰寫的 sdk,置於 app/libs 之下即可。
application
指定 Main Class
jar
編譯打包時,能在 MANIFEST.MF 自動加入 Main-Class
新增檔案
假如 Main Class 為 net.ddns.mahaljsp.mix.App,請在專案下的 app\src\main\java 下新增 net\ddns\mahaljsp\mix 目錄,再新增 app.java,內容如下
package net.ddns.mahaljsp.mix;
public class App {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
執行
gradle run
編譯
將專案編譯打包成 .jar 檔,編譯好的結果位於 app/build/libs 之下
gradle build
gradle build 並不會把 mysql 等 .jar 包進去,所以是無法執行的。
gradle shadowJar
要把相關 libs 及 sdk 也打包進去,需修改 build.gradle 設定如下
plugins {
id 'application'
id 'com.gradleup.shadow' version '9.4.1'
}
使用如下指令編譯打包
gradle shadowJar
使用如下指令即可執行
java -cp "app-all.jar" net.ddns.mahaljsp.mix.App
安裝檔
使用如下指令產生安裝檔
gradle installDist
會在專案下產生 app\build\install\app 目錄,裏面有 bin 及 lib 目錄。
bin 目錄是啟動腳本。而 lib 則是包含所有相依性的 jar,包含了 app.jar。
進入 bin 後執行 ./app 即可執行。
./app
lib 下即然包含了所有的 jar,所以也可以用如下指令執行
java -cp "app.jar;./*" game.App
Maven 專案
maven 不如 gradle 靈活,但現今大部份企業還是採用 maven,所以僅作記錄用。
Maven下載
Windows 到 https://maven.apache.org/download.cgi 下載解開後,將目錄移到 C:\ 並改名為 maven,然後將 C:\maven\bin 設定於系統 path 中。
Linux 使用如下指令安裝
sudo apt install maven
VSCode 擴充包
VSCode 的 Extension 需安裝 Maven for jave。
開啟專案
進入 VSCode 後,先要 open Folder 進入某一目錄,比如 e:\maven。
然後 Ctrl + Shift + p,輸入 Java: Create Jave Project,選取 Marven,再選取 maven-archtype-quickstart,選 1.4 版本,輸入網域,再輸入專案名稱,比如 game。 Folder 選 e:\maven 即可。
Define value for property ‘version’ 1.0-SNAPSHOT : 直接按 enter,package 直接按 y。此時就會在 e:\maven 下建立 game 專案。
VSCode 再開啟 Folder,選 e:\marven\game,即可開啟新專案。
pom.xml 設定
修改及新增如下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<build>
<!--
底下要刪除
<pluginManagement>
-->
<plugins>
...............
<!--新增如下 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
<configuration>
<mainClass>net.ddns.mahaljsp.App</mainClass>
</configuration>
</plugin>
</plugins>
<!--
底下要刪除
</pluginManagement>
-->
</build>
todo
執行
在 Terminal 輸入如下即可執行
mvn exec:java
todo
編譯
輸入如下指令即可編譯成 .class,結果位於專案下的 target\class,
mvn clean compile
todo
使用 mysql
在 pom.xml 的 dependencies 裏,新增如下設定。
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
</dependencies>
更新 pom.xml 後會自動下載驅動程式,並儲存在
C:\Users\登入者\.m2\repository\com\mysql\mysql-connector-j\8.4.0
自訂 sdk
把自訂的 sdk,比如 mahaljsp.jar,置於專案之下,然後使用下面的指令上傳到本地的 repository
mvn install:install-file -Dfile="mahaljsp.jar" -DgroupId="net.ddns.mahaljsp" -DartifactId=mahaljsp -Dversion="1.0" -Dpackaging=jar
上傳的位置位於如下目錄
C:\Users\登入者\.m2\repository\net\ddns\mahaljsp\mahaljsp\1.0
然後在 pom.xml 新增如下
<dependency> <groupId>net.ddns.mahaljsp</groupId> <artifactId>mahaljsp</artifactId> <version>1.0</version> </dependency>
如此在代碼中,就可以使用 np,os 等類別。
打包成 jar
pol.xml 的 plugins 裏增如下設定
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>net.ddns.mahaljsp.App</mainClass>
</transformer>
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
<finalName>${project.artifactId}-all</finalName>
</configuration>
</execution>
</executions>
</plugin>
然後在 Terminal 輸入如下指令
mvn clean package
就會在 target 下產生 .jar 檔案。此 .jar 包含了 libs 及 自訂 sdk 的 jar 檔。
