1. 引言
Gradle工程可以看做是在java工程的基礎上,附加了gradle的資訊建立的,是以一個gradle工程擁有java工程的所有配置,包括.project、.classpath、.settings\org.eclipse.jdt.core.prefs三個配置檔案。
有了java工程的基本配置後,再在父工程中增加settings.gradle、build.gradle檔案,其中build.gradle可選,記錄每個子工程都需要的配置資訊。各個子工程中增加build.gradle檔案。
Java子工程之間的依賴仍然使用build path解決,gradle的子工程間依賴在build.gradle的dependencies中設定。
2. 環境
2.1. Gradle安裝
網上有很多教材,不贅述。
1. 下載下傳最新的gradle解壓到一個目錄;
2. 增加環境變量GRADLE_HOME(gradle的解壓目錄)、及GRADLE_USER_HOME;
3. 在環境變量PATH中增加一個 %GRADLE_HOME%\bin
2.2. Eclipse Gradle插件安裝
安裝buildship插件,預設已安裝,如果沒安裝,則在help->eclipse marketplace中搜尋buildship,然後點選安裝。
3. 建立工程
3.1. 建立主工程
Eclipse建立工程時,選擇一個gradle工程,然後建立。其實建立的是一個父工程,預設包含一個叫lib的子工程。
父工程路徑下有settings.gradle,其中記錄了包含的子工程,同時也可以有build.gradle檔案,指定所有子工程都需要的東西,比如plugin。
3.2. 修改子工程名稱
以下1、2兩條都要修改
1. 在settings.gradle的include中修改工程名稱;
2. 改變lib目錄下的.project中的name項;
3. 修改lib路徑的名稱,與工程名保持一緻;
4. Native-image編譯
4.1. 環境準備
4.1.1. 安裝graalvm的native-image工具
gu install native-image
4.1.2. 安裝VisualStudio 2019
Community版本或Professional版本都可以,安裝完成後,需要将VisualStudio的環境設定成英文版本,如果沒有該版本,請在Start Experimental Instance of Visual Studio 2019中安裝英語,然後再設定。否則會報錯:https://github.com/oracle/graal/issues/3784
4.1.3. 設定以下環境變量
如果不設定,則會報錯“stdio.h: no include path set”
[MSVC]C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333
[WK10_INCLUDE]C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0
[WK10_LIB]C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0
[INCLUDE]:%WK10_INCLUDE%\ucrt;%WK10_INCLUDE%\um;%WK10_INCLUDE%\shared;%MSVC%\include;
[LIB]%WK10_LIB%\um\x64;%WK10_LIB%\ucrt\x64;%MSVC%\lib\x64;
[PATH]%MSVC%\bin\HostX64\x64
4.2. 配置build.gradle
參照這個連結配置:https://graalvm.github.io/native-build-tools/0.9.5/gradle-plugin.html,增加插件及插件下載下傳的庫。
plugins{…
id 'org.graalvm.buildtools.native' version '0.9.5'
}
repositories {
mavenCentral()
gradlePluginPortal()
}
如果需要生成能夠獨立執行的exe,則需要指定mainClass,在build.gradle中增加以下内容:
graalvmNative {
binaries {
main {
imageName = '程式名稱'
mainClass = 'com.njhx.mesh.client.MainFrame'
useFatJar = false //不要設定為true,會報異常,不知道為什麼
…
}
}
}
4.3. 編譯
運作gradle nativeCompile編譯原生程式。
5. 碰到的問題
5.1. 找不到jre的庫
修改jre配置,為workspace default jre,也可以指定具體的目錄,這樣的缺點是,jdk改變目錄時,需要修改工程的配置
5.2. Java工程編譯時使用了jdk 16
使用gradle7.2時,預設使用jdk11,。這種情況,如果用jdk11運作,導緻UnsupportedClassVersionError異常。
子工程.settings\org.eclipse.jdt.core.prefs檔案中設定了源碼及編譯class的版本,在gradle項目中,歸根結底是在build.gradle中設定的。首先增加eclipse插件,然後在eclipse中增加sourceCompatibility、targetCompatibility,然後右鍵點選build.gradle重新整理後,就正常了。
plugins {
id 'java-library'
id 'eclipse'
}
eclipse {
jdt {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_11
javaRuntimeName = "jdk"
}
}
sourceCompatibility設定成1.8,是為了相容安卓版本上的代碼,以免寫了很長時間,發現在安卓上又要改寫。
此處的javaRuntimeName是我eclipse環境中設定的,根據自己的環境修改,否則每次gradle重新整理後,特别是7.2版本,會預設使用jdk16。
5.3. 本地庫問題
建一個libs目錄,将jar全部存入該目錄
1. 工程中将jar加入build path,與普通java工程一樣,否則import的地方全部失敗;
2. Build.gradle檔案的dependencies中加一行;
implementation fileTree(dir:'libs', include:['*.jar'])
5.4. 怎樣修改父工程名稱
在父工程的.project、settings.gradle中修改name
5.5. 引入本地jar
在子工程中建目錄libs,将jar拷貝到這裡,然後在build.gradle的dependencies中增加一行,引入libs目錄下的所有jar:
implementation fileTree(dir: 'libs', include: '*.jar')
也可以逐個jar加入dependencies:
implementation files('libs/a.jar','libs/b.jar')
如果是多個路徑,又不想寫路徑名稱,可以加一條
repositories { flatDir { dirs 'libs1', 'libs2' } }
在build.gradle的dependencies中增加jar時,就不必寫目錄名了
implementation name: 'sample-jar-0.8.7'
如果子工程被其他工程依賴,同時又希望自己依賴的jar傳遞到依賴工程中,可以用:
api files('libs/a.jar','libs/b.jar')
5.6. 子工程之間的依賴
在需要依賴其他子工程的工程build.gradle的dependencies中增加:
implementation project(':util')
一種的”util”是工程名稱,完整格式是group:projectname,因為沒有設定group,直接以“:”開始。也可以寫成以下這種方式,将依賴關系傳遞到依賴此工程的工程中去
api project(':util')
5.7. 打jar包時,增加manifest資訊
在build.gradle中修改jar的task配置
jar {
manifest {
attributes(
'Manifest-Version':"1.0",
'Built-By' : System.properties['user.name'],
'Build-Timestamp': new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(new Date()),
'Build-Revision' : version,
'Created-By' : "Gradle ${gradle.gradleVersion}",
'Build-Jdk' : "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})",
'Build-OS' : "${System.properties['os.name']} ${System.properties['os.arch']} ${System.properties['os.version']}"
)
}
}