【备忘】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编译

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

猜你喜欢

转载自blog.csdn.net/flyinmind/article/details/120231019
今日推荐