OpenJML+SMTSolver的形式化验证想必大家都已经尝试过了。大家或许体验的更多的是IDEA上命令行输出版本的OpenJML插件,但真正得到官方支持的完全版OpenJML是它的Eclipse版插件。Eclipse上的OpenJML可以轻松输出验证错误信息,提供问题代码高亮,提供全推导过程,甚至能够在代码中给出对有问题的代码的反例。下面的图片中均为win10系统OpenJML+z3 4.7.1的输出结果,左侧IDEA的结果只有命令行输出,而右侧Eclipse的结果中左下角为每个函数是否通过验证的大纲视图,右下角为单个函数的推导过程,而代码中光标所在位置则给出了可能有问题的代码的反例,此处标出currentPid可能会在自增过程中溢出,反例为currentPid等于2147483647时出现错误。

虽然Eclipse的OpenJML插件极为好用,但是IDEA方便的代码编辑又不值得我们为此更换IDE。为了同时使用两个IDE的方便之处,又免去重复设置项目的烦恼,我们可以使用它们共同识别的项目类型。为此,我们可以使用一种新的项目类型:Maven项目来管理我们的程序。

Maven是什么?

Maven是一个利用项目对象模型(POM)的项目管理工具。它有如下好处:

  • 设置简单:创建、使用一个Maven项目和一个普通Java项目并没有什么区别。基本的操作都是一致的。
  • 它定义了一种标准的目录结构,源代码和测试代码都有默认的路径,不需要我们手动设置test文件夹。
  • 它能方便地定义项目之间的依赖关系,相比于传统项目通过jar包添加依赖,我们可以直接依赖于某个特定的项目本身,所依赖项目的更新不需要再替换jar包,只需一次git pull。
  • 课程中所依赖的课程组库项目会成为我们项目中的一部分。在项目管理器Project选项卡中除了我们的代码以外也能看到课程组提供的代码,让你在一个编辑器中完成所有操作。
  • 它能够被IDEA、Eclipse等主流IDE自带支持。一次配置,全部可用。

Maven还有其他很多好处,例如可以帮助维护项目开发周期等等,不过上面这几个好处就已经足够我们使用它了。

创建Maven项目

以下步骤均为IDEA内的操作。依然是往常一样File→New→Project,在New Project中选择Maven。选好需要的jdk版本,不需要选择archetype,直接下一步。

下一步中,GroupId可以随意设置,一般设置为多段的形式,例如“cn.sheryc”;ArtifactId为项目名。设置好这两项之后next→finish即可。

添加项目依赖

第一次创建Maven项目后需要等待一段时间,耐心等待下方的后台任务条走完即可。创建好项目后,右下角可能会出现Maven projects need to be imported,选择Enable Auto-Import就好。

在创建好的项目中,我们能看到根目录下有一个pom.xml文件,那是Maven项目的标志,一个Maven项目正是通过该文件进行管理的。下面我们需要在其中添加课程组给的库作为依赖。如果你细心的话,会发现课程组在gitlab上不断更新的库中也有一个pom.xml,表示它同样是一个Maven项目,这使得我们添加这个库变得更加方便。

首先我们需要将课程组的库导入进系统的.m2目录下,IDEA的Maven支持能帮我们简化这个过程。.m2目录存放了Maven能识别和导入的所有项目,我的理解是它类似于python的pip安装的目标目录。将课程组在gitlab上提供的库git clone到本地任意位置。接着,在IDEA右侧的选项卡中找到Maven,点击,在上面的按钮中找到“Add Maven Projects”,将课程组提供的库的pom.xml选中。导入后,我们能看到自己的Project界面多出了课程组提供的库。

接着我们需要在我们的项目中添加课程组提供库的依赖。首先在课程组库的pom.xml下查看该库的groupIdartifactIdversion,它们是导入项目的坐标。将写有这三项信息的部分复制下来,在自己的pom.xml的<project>标签内部添加如下代码(中间一块是从课程组的pom.xml复制来的):

<dependencies>
<dependency>
<groupId>oo-course-2019</groupId>
<artifactId>specs-homework-1</artifactId>
<version>1.1-edu</version>
</dependency>
</dependencies>

至此,我们的项目就可以依赖课程组库中的代码了。当课程组更新代码时,我们不需要再通过替换jar的方式跟着替换,而是只需要在课程组库的文件夹里git pull保持最新状态即可。当课程组更新了版本号时,也只需同步更改pom.xml中依赖库的版本号即可。更强大的是,由于我们依赖的是整个库,所以不需要进行任何改动,OpenJML就能检测到源代码中的代码规格。

当然,我们自己查看助教提供的代码规格也很简单:课程组的项目库已经被添加到了我们的Project中,在我们的Project选项卡中就能看到课程组库项目中的所有文件了。

创建单元测试

Junit4是课程组推荐的单元测试模块。IDEA对Junit有着很好的原生支持,所以不需要进行任何配置即可开始使用JUnit。

在希望添加单元测试的类的类名上按alt+enter,选择create test,testing library选择Junit4,勾选上需要测试的方法,按需勾选@before和@after,即可生成测试文件。Maven项目中,所有的测试文件都会被自动生成到%PROJECT%\src\test\java文件夹下,将测试和源代码分开。

如果单元测试中有对多个类的测试文件,只需要按照下面图中的步骤添加一个跑所有单元测试的配置便能一键运行所有测试:

导入Eclipse

Eclipse对Maven同样有着很好的支持,所以我们直接导入在IDEA中写好的项目即可完成在两个IDE中对同一个项目的共享。

在Eclipse中,选择File→Import...,在Maven中选择Existing Maven Projects,在弹出的对话框的Root Directory选择我们项目的根目录,Eclipse即可自动检测到pom.xml文件。点击finish完成导入。在Eclipse中导入项目可能会匪夷所思地探测不到课程组提供的库,即使它已经显示在我们项目的Maven dependencies中,这时只需像导入自己的项目一样再导入一下课程组的Maven项目即可。

导入结束后,就可以愉快地在Eclipse中安装OpenJML插件,设置好Solver,享受官方亲儿子版本的OpenJML检测啦~

对于OpenJML中的报错,可以从https://www.openjml.org/documentation/checks.shtml中找到对应解释。一般“无法建立assertion”就表示违反了规格中的限定。

用Maven+IDEA+Eclipse组合获得最好的OpenJML体验的更多相关文章

  1. Maven学习总结(六)——Maven与Eclipse整合

    一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin

  2. 转】Maven学习总结(六)——Maven与Eclipse整合

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4052025.html 感谢! 一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E ...

  3. (转)Maven学习总结(六)——Maven与Eclipse整合

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(六)——Maven与Eclipse整合 一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenP ...

  4. Maven学习总结(6)——Maven与Eclipse整合

    Maven学习总结(六)--Maven与Eclipse整合 一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipseP ...

  5. 零基础学习java------40---------Maven(maven的概念,安装,maven在eclipse中使用),springboot(spring整合springmvc(注解),spring整合mybatis(常见的配置文件)),前端页面(bootstrap软件)

    一 maven 1. Maven的相关概念 1.1 项目开发中遇到的问题 (1)都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? (2)为什么在我的机器上可以正常打包,而配置管理 ...

  6. 【Java EE 学习 82 下】【MAVEN整合Eclipse】【MAVEN的一些高级概念】

    一.MAVEN整合Eclipse MAVEN是非常优秀,但是总是要开命令行敲命令是比较不爽的,我们已经习惯了使用IDE,所以还有一种将MAVEN整合到Eclipse的方法. 详情查看:http://w ...

  7. Maven学习(一) -- 安装Maven及Eclipse中配置Maven

    标签(空格分隔): 学习笔记 本文环境:Windows7, JDK1.7.0_76 安装及配置Maven环境变量 需要电脑中已经有Java环境 在控制台中输入:echo %JAVA_HOME%看是否能 ...

  8. 【Maven】Eclipse 使用Maven创建SpringMVC Web项目

    创建环境 系统:win 10 软件:eclipse,maven. 创建步骤 创建一个Maven Web项目,可以参照:[Maven]Eclipse 使用Maven创建Java Web项目 添加spri ...

  9. Maven和Eclipse联合开发(转)

    最近公司突然把以前的架构推到从来,这个还真需要勇气,不过也是的,基础不好,再好的房子也站不稳.公司采用Maven作为项目管理,WebService项目框架采用SDHI.(Spring+Dubbo+He ...

随机推荐

  1. JTree知识小点

    创建一个新节点 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点"); 被选中的节点 Default ...

  2. CF1042F Leaf Sets (贪心+树上构造)

    题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数 手动yy的贪心竟然对的 对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶 ...

  3. cf掉分记——Avito Code Challenge 2018

    再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: ...

  4. java.lang.NoClassDefFoundError: org/apache/commons/collections4/ListValuedMap

    最近在使用java PiO导入导出Excle在windos本机上运行没有问题: 但是!!问题来了!放到Linux服务器上部署后出现异常 java.lang.NoClassDefFoundError: ...

  5. java判断输入的数字的位数_数字问题

    import java.util.Scanner;public class Numbers { public void Judgy(int n){ for(int i=0;i<100;i++){ ...

  6. js Math常用方法

    ------------------------ 向上取整,有小数就整数部分加1 Math.ceil(5/2) ------------------------ 四舍五入. Math.round(5/ ...

  7. [AngularJS]Chapter 5 与服务器交互

    第八章有关于缓存的东西. [通过$http交互] 传统的AJAX请求如下 var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange ...

  8. Markdown简单介绍和基本的语法

    原文发表自我的个人站点 http://www.hainter.com/markdown.欢迎大家訪问,谢谢支持~ Markdown是一种语言,能够用于编写高质量的文章,语法简单易用 Markdown的 ...

  9. HDOJ 5299 Circles Game 圆嵌套+树上SG

    将全部的圆化成树,然后就能够转化成树上的删边博弈问题.... Circles Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  10. bzoj1797: [Ahoi2009]Mincut 最小割(最小割+强联通tarjan)

    1797: [Ahoi2009]Mincut 最小割 题目:传送门 题解: 感觉是一道肥肠好的题目. 第二问其实比第一问简单? 用残余网络跑强联通,流量大于0才访问. 那么如果两个点所属的联通分量分别 ...