目录【阅读时间:约10分钟】
中级实训第一天的自学报告
姓名:隐藏敏感信息 学号:隐藏敏感信息
今天是中级实训的第一天,笔者首先浏览了一下中级实训的架构,发现主要是围绕Vim+Java+Ant+Junit+SonarQube展开。具体流程可概括为:使用Vim来编写Java代码, 利用Ant实现Java代码的自动编译,利用Junit来进行单元测试,利用SonarQube来分析代码。
虽然自学报告只要求分享Vim+Java+Ant+Junit的自学经历,为了方便读者与以后的自己观看,笔者还是尽量书写较为完整的自学经历,因此要求外的会打上【附加】的tag。
一、Vi/Vim
Vim编译器是一款久负盛名的编译器,常常被称为“编译器之神”或“大神用的编译器”,它是linux中最经典的文本编辑器,支持代码补全、编译及错误跳转等功能。对于虽然不能说完全掌握Vim但也有几年使用经验的笔者来说,笔者更倾向于在CLI界面下使用Vim,比如实验室服务器往往就通过ssh连接linux terminal,这时使用Vim编辑器可以很好地编写各种代码。而在GUI界面下,笔者更倾向于使用sublime或eclipse来编写java代码,特别是后者在设置了熟悉的自动补全后,可以提升地提升工作效率。当然,在此次实训中笔者会尽量使用Vim来熟悉项目开发流程。
Vim编译器一共有命令模式、末行模式和编辑模式这三种工作模式,这三种模式的区别可以用以下一段话来概括。使用Vim打开文件时首先进入的就是命令模式,可以看做Vim编译器的入口,可以进行复制粘贴等操作;在命令模式按 i 便会进入编辑模式,可以进行各种代码或文字编辑操作,再按esc便会退回到命令模式;在命令模式按输入 : 进入末行模式,可以进行保存退出等操作。
笔者常用的Vim指令有以下这些:
①打开文件:在terminal输入vim filename
②保存并退出:在末行模式输入wq
③复制一行代码:在命令行模式输入yy
④粘贴:在命令行模式输入p
⑤删除一行代码:在命令行模式输入dd
⑥撤销操作:在命令行模式输入u
⑦在编辑模式下:与文本编辑类似,方向键移动,正常键盘输入
二、Java
由于在大二时笔者已选修了Java语言开发的相关课程,因此在进行这部分的自学时比较轻松,主要是温故了Java的基本语法和使用命令行编译运行Java程序。
在笔者看来Java是是一门典型的面向对象编程语言,它尽可能地进行封装,拥有丰富的库函数与接口支持,对于协同开发效率很高,这也是Java常年位于编程语言排行榜前列的原因之一。Java程序的编写流程也不复杂,以熟悉的eclipse工具为例,主要流程是创建一个Java project,创建相应的package和class,然后写main函数与要调用的函数即可。此处便省略基础的Java语法介绍了,直接用一个简单的helloworld例子来说明如何使用命令行创建、编译并运行Java程序吧~~
首先创建并书写代码:
然后使用命令行编译运行Java程序:
此外,虽然云桌面的环境变量已经配置了很多,但是直接执行java helloworld还是会报错: could not find or load main class helloworld 。
经搜索相关资料,是java的环境设置不完全,只要在 ~/ .bashrc和~/ .profile添加以下的环境变量设置即可:
进入 ~/.bashrc和~/.profile的指令如下:
gedit ~/.bashrc
gedit ~/.profile
要添加的环境变量如下:
export JAVA_HOME=~/Desktop/java1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
三、Ant
正如上文所述,Ant可用于实现Java代码的自动编译,Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。根据笔者的自学体会,它的作用与C/C++的makefile类似,一次性编译多个文件,大大方便了项目编译的流程,能减少很多重复的操作。
Ant使用xml格式来编写,若要在项目中使用Ant,首先要在项目文件下面创建build.xml文件,并在xml文件中编写与项目相关的指令。编写完毕后,在项目文件下执行ant指令即可。
Ant中主要的元素有三种,分别是、和。
(1)project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。 project 元素有如下属性:
①name 属性:用于指定 project 元素的名称
②default 属性:用于指定 project 默认执行时所执行的 target 的名称
③basedir 属性:用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录
作为基准目录。
(2)target 元素是Ant 的基本执行单元,它可以包含一个或多个具体的任务。多个 target 可以存在相互依赖关系。target 元素有如下属性:
①name 属性:指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target
②depends 属性:用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需
要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个target。被依赖的 target 会先执行
③if 属性:用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行
④unless 属性:该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行
⑤description 属性:该属性是关于 target 功能的简短描述和说明
(3)property 元素:该元素可看作参量或者参数的定义,类似于C/C++中的宏定义,可以用一些我们便于理解的变量名来代替复杂的路径,提高代码的可读性。
project 的属性可以通过 property元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入: <property file=” build.properties”/>
下面不妨借助【二、Java】中的helloworld代码,编写一个简单的build.xml来体验Ant工具。在项目目录helloworld-ant中,将helloworld.java放在src文件夹中,在项目目录下创建build.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created by 18342026 -->
<project name="helloworld" default="run" basedir=".">
<property name="src_path" value="src"/>
<property name="class_path" value="classes"/>
<target name="clean">
<delete dir="${class_path}"/>
</target>
<target name="compile" depends="clean">
<mkdir dir="${class_path}"/>
<javac srcdir="${src_path}" destdir="${class_path}"/>
</target>
<target name="run" depends="compile">
<java classname="helloworld" classpath="${class_path}" />
</target>
</project>
在项目目录下运行指令ant,即可自动编译并运行如下:
四、Junit
Junit是Java的一种单元测试框架,它所做的测试是白盒测试,常用于测试驱动开发(Test-Driven Development,简称TDD) 。由于之前选修的Java课程已接触过Junit框架,并且最近也通过Golang课程学习了TDD开发流程的思维,其实就是通过函数的输入输出来确定函数的正确性。
要使用Junit,需要配置好环境,并将junit的jar文件放到项目目录中。由于笔者查看的junit教程版本为junit 4.10,仍然以简单的helloworld程序为例,在项目目录helloworld-junit中,放入junit-4.10.jar、编写helloworld.java和Test_helloworld.java文件。
其中helloworld.java代码为:
public class helloworld{
public static void main(String[] argv) {
System.out.println(sayhello());
}
public static String sayhello() {
return "Hello World By 18342026!";
}
}
Test_helloworld.java代码为:
import static org.junit.Assert.*;
import org.junit.Test;
public class Test_helloworld{
@Test
public void test_helloworld() {
String res = helloworld.sayhello();
assertEquals("Hello World By 18342026!", res);
}
}
最后执行以下指令即可运行junit进行单元测试:
javac -classpath .:junit-4.10.jar Test_helloworld.java
java -classpath .:junit-4.10.jar -ea org.junit.runner.JUnitCore Test_helloworld
运行截图:
【附加】五、SonarQube
由于中级实训阶段一要用到SonarQube,虽然没有要求写相应的报告,但笔者感觉书写报告还是对提高软件的熟练度有帮助的。
Sonar 是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括 java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy 等等二十几种编程语言的代码质量管理与检测。
经检查,云桌面已配置好Sonar了:
在 shell 里面键入 cd $SONAR_HOME, 可以直接进入启动目录。 在 shell 里面键入
./sonar.sh start 启动服务
./sonar.sh stop 停止服务
./sonar.sh restart 重启服务
访问 http:\localhost:9000, 如果显示 Sona输入rQube 的项目管理界面,表示安装成功:
以阶段一的calculator程序为例,在项目目录下创建sonar-project.properties,其中只需要将sonar.projectKey、sonar.projectName和java-module.sonar.projectBaseDir的值修改为源码所在的文件夹即可,具体内容如下:
然后在当前目录下输入sonar-runner,再进入http:\localhost:9000查看程序的代码分析即可:
经过Major的提示修改后,学到了不少代码风格的知识,修改后如下:
【附加】六、 编译运行BugRunner
在仓库( https://github.com/se-2020/se-2020.github.io/tree/master/resources )中下载gridworld.zip并解压,再将里面的GridWorldCode.zip解压出来,进入目录GridWorldCode\projects\firstProject\中,即可看到BugRunner.java代码。
由于环境在之前已配置完毕,直接在当前目录下运行以下指令,即可进入BugRunner程序中:
javac -classpath .:./../../gridworld.jar BugRunner.java
java -classpath .:./../../gridworld.jar BugRunner
再来简单介绍一下BugRunner,首先用户可以自行在格子中放置可移动的虫子以及不可移动的花和石头,然后点击step是移动一步,点击run是自动开始移动多步,slow/fast的游标可以调节移动速度,stop则是停止。其他更详细的信息可看Part1的回答。
总的来说,BugRunner的试玩体验尚可,当做休闲游戏玩玩其实也很不错~~
七、 总结
中级实训的第一天很快就过去了,在报告上可以看得出使用了不少的工具,也遇到并解决了不少的坑。
但总的来说,阶段一的任务还是比较轻松的,两天的任务其实一天内完成并不困难。在笔者看来,阶段一更多的是适应与使用工具,尚未进入到真正的实训coding阶段,作为实训的入门难度低一些自然也是合理的。
当然,能够比较顺利地完成阶段一的任务,很大一部分原因是多亏了云桌面已经配置好了许多环境,并提供了不少的参考文档支持和TA们的详细解答。希望之后的实训也如今天一样顺利吧~~