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编译
native编译效果并不理想,内存消耗与非native区别不大。
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']}"
)
}
}
5.8 Java工程不同步问题
重新安装gradle,导致gradle下载的依赖库全部消失,或修改build.gradle后,java工程不会自动更新,相应的库不会自动加载到reference libraries中,这时需要在命令行中运行以下命令刷新。
Gradle cleanEclipse
清除java工程的eclipse设置
gradle eclipse
重新创建java工程的eclipse设置,包括.classpath、org.eclipse.jdt.core.prefs等
5.9 中文注释提示GBK告警
在父工程目录下新建gradle.properties文件,文件中写入以下内容:
org.gradle.jvmargs=-Dfile.encoding=UTF-8
详见Solving common problems (gradle.org)
6. 常用命令
查看Project中所有任务:gradle tasks
查看Project中所有属性:gradle properties