VSCode 與 Java 專案建立

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 檔。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *