在软件构造实验中,我们将代码提交到GitHub仓库前,实验还要求我们使用其他工具build我们的实验代码以脱离环境,这些工具包括Ant 、Maven 、Gradle、Travis-CI等 。
然而这些构建工具不论是在线的还是离线的,都需要基于Groovy的DSL或xml语言来编写构建配置文件,还需要组织成maven特有的项目目录结构。由于我们并没有时间从头学习这些语言,再加上网上资料大多是两年以前发布的,有些参考性较低,想要在短时间内入手并且使用这些工具十分困难。本人经过艰难摸索,找到了简单使用Gradle进行脱离环境的方法。为了让大家少走弯路,以专门针对软件构造课程的方式,包括使用方法和注意事项,在此分享给大家。
Gradle的安装和配置
下载地址:https://gradle.org/install/
安装很简单,网上有很多教程,只需要注意环境变量的配置,这里分享两个安装教程:
https://blog.csdn.net/u011510678/article/details/79589944
https://blog.csdn.net/zhaokai0130/article/details/81008719
构建Gradle项目
Gradle安装完成后我们需要先建立起Gradle项目骨架(我安装的版本是7.0.2):
首先创建一个我们要作为Gradle项目的目录(这里以testgradle为例)
从cmd进入该目录,使用指令gradle init构建基本骨架
然后选择我们需要的配置
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit 4) [1..4] 1
Project name (default: testgradle): gradletest
Source package (default: gradletest): gradletest
> Task :init
Get more help with your project: https://docs.gradle.org/7.0.2/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 1m 24s
2 actionable tasks: 2 executed
完成后,我们可以看到testgradle目录下出现了构建的基本骨架
在cmd内testgradle目录下输入tree可以看到目录结构,可以看出基本为maven结构
D:\java\sourse\testgradle>tree
卷 Data 的文件夹 PATH 列表
卷序列号为 2CF7-E288
D:.
├─.gradle
│ ├─7.0.2
│ │ ├─dependencies-accessors
│ │ ├─executionHistory
│ │ ├─fileChanges
│ │ ├─fileHashes
│ │ └─vcsMetadata-1
│ ├─buildOutputCleanup
│ ├─checksums
│ └─vcs-1
├─app
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─gradletest
│ │ └─resources
│ └─test
│ ├─java
│ │ └─gradletest
│ └─resources
└─gradle
└─wrapper
(其中各个文件的作用可以参考文章:https://www.jianshu.com/p/f33bb06e447e)
但是这与我们的实验中要求的项目目录结构不同,所以我们需要更改。
更改目录结构
maven原目录结构中主程序放在src/main/java下,测试程序放在src/test/java下,如果我们直接将src和test内的文件分别放在src/main/java和src/test/java中,其中的读取和写文件操作地址会出错。于是我们可以改变默认的目录结构。
我们使用记事本打开app目录下的build.gradle,在其中加上
sourceSets{
main{
java { srcDirs=['src'] }
}
test{
java { srcDirs=['test'] }
}
}
我们将默认读取主程序目录由src/main/java改为app/src,将默认读取测试程序目录由src/test/java改为app/test,如有需要则更改为其他目录。
参考文章:https://www.cnblogs.com/syrgdm/p/13198130.html
编写build.gradle
为了完成build,我们需要在build.gradle上做一些工作
修改编译编码格式为UTF-8
如果不修改编码格式,Gradle会默认按GDK编码编译,其中的汉字会被识为乱码
于是我们在build.gradle中添加
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
修改编译编码格式为UTF-8。
加载本地指定目录jar包
实验中我们的jar包都放在lib文件夹下,为了在编译时能够使用到这些jar包,我们需要将lib加载。在build.gradle中的dependencies中添加
implementation fileTree(dir:'lib',include:['*.jar'])
即(其他部分为创建时默认部分)
dependencies {
// Use JUnit test framework.
testImplementation 'junit:junit:4.13.1'// This dependency is used by the application.
implementation 'com.google.guava:guava:30.0-jre'implementation fileTree(dir:'lib',include:['*.jar'])
}
参考文章:https://blog.csdn.net/qq_31945977/article/details/81778044
放置代码并进行build
将我们的实验目录复制到app目录下,其中原src文件将被替换掉。
cmd中在gradle项目目录下在输入gradle build,gradle会对我们的代码进行build,并会打印提示信息。
完成后在app/build/classes目录下生成各.java文件编译后的.class文件
若测试出错,会在app/build/reports/tests/test下产生index.html网页测试报告
测试参考文章:https://blog.csdn.net/ashencode/article/details/82177987
注意事项
(1)lib应在app目录下。
参考文章:https://blog.csdn.net/liangzhihao1995/article/details/52901051
(2)若我们使用网上的教程提供的build.gradle出现Could not find method XXX() for arguments [YYY] on object of type DefaultDependencyHandler问题,可能是版本更换导致DSL语言不可用。
如compile和implementation,因为版本更换高版本使用implementation,而不能识别compile。
参考文章:https://blog.csdn.net/jiangguangchao/article/details/106673062