天天看點

【備忘】Eclipse Gradle工程中碰到的一些問題

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']}"

        )

    }

}