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. splay 文艺平衡树 (数据结构)

    题目大意:略 splay维护区间翻转裸题,为了减少不必要的麻烦,多插入两个点,分别是0和n+1 每次找区间的第K个值,就在splay上二分即可 顺便学了一下splay的完美建树,而且splay有一些小 ...

  2. php 中引入邮箱服务 , 利用第三方的smtp邮件服务

    项目中用短信通知有时间限制,对一些频率比较大的信息力不从心. 使用邮箱发送信息是个不错的选择\(^o^)/! 首先要注册一个邮箱,在邮箱设置里开通smtp功能. 简单介绍下smtp,大概就是第三方客户 ...

  3. 洛谷 P2652 同花顺

    P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...

  4. jQuery Mobile(jqm)button的隐藏和显示,包含a标签,圆角和非圆角button

    在移动互联网时代,HTML5开发越来越收到欢迎. 于是各种HTML5的框架都出来了.因为对于jquery的熟悉,jquery mobile 为多数人选择学习的对象.我也是众多追求者之中的一个.近期一直 ...

  5. python抓取新浪微博评论并分析

    1,实现效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbnphbw==/font/5a6L5L2T/fontsize/400/fill ...

  6. war包放入tomcat

    1.找到tomcat的安装路径(如:D:\example\download\set\apache-tomcat-7.0.23) 2.D:\example\download\set\apache-tom ...

  7. 89.[NodeJS] Express 模板传值对象app.locals、res.locals

    转自:https://blog.csdn.net/Elliott_Yoho/article/details/53537437 locals是Express应用中 Application(app)对象和 ...

  8. [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)

    题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...

  9. [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)

    题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...

  10. Java 8 Concurrency Tutorial--转

    Threads and Executors Welcome to the first part of my Java 8 Concurrency tutorial. This guide teache ...