java - Maven 构建中的合同检查
问题描述
我正在 IJ 中开发 Java 代码库,目前正在使用 Maven 构建。我想用某种形式的合同来补充一些代码,这些合同将在 Maven 构建中获得。到目前为止,我一直没有成功寻找这种现成的功能:
- OpenJML,但这似乎需要它自己的工具来分析您的代码,我找不到将其轻松集成到构建中的方法。
- Jetbrains 合同。这些将通过检查在 IntelliJ 中发出警告,但它们不会影响构建。
注意:我只关心编译时可检查的合约。我有 JUnit 来处理运行时方面的问题。
执行合同:
我添加了这一部分来回答询问我想要执行什么样的合同的评论。理想情况下,我想要最强大的解决方案,条件是该解决方案是完整的。当我在这里说完整时,我的意思是一种合同语言和一个合同检查器,这样语言中的每条语句都可以在编译时由检查器检查为好/坏。我知道这可能是一个很大的问题,但即使是最简单的合同,例如Jetbrains 提供的合同,我也会感到满意。
对于一个具体的例子,考虑这个函数:
public static Long safeToLong(String value) {
if (value == null) {
return null;
}
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
return null;
}
}
这成功通过了 Jetbrains 合约:
@Contract("null -> null")
并未能完成这个人为的合同:
@Contract("null -> !null")
但是有了上述人为的、糟糕的合同,Maven 构建仍然可以正常工作。构建不会获取检查结果 - 这些仅在 IJ 内可见。如果违反任何合同,我希望能够参与构建并失败。
解决方案
这是一个适用于 IntelliJ 合同的解决方案。这有点混乱,但它有效:
- 将Bentolor 的 CLI 检查器工具下载/克隆到您的工作目录,即 .idea 文件夹所在的目录
- 创建仅启用以下检查的 IJ 检查配置文件:恒定条件和异常以及合同问题
- 如果您愿意,可以创建检查范围- 这将限制您的检查仅在某些文件上运行
- 编辑 Bentolor 工具附带的 .ideainspect 文件,设置您刚刚定义的检查配置文件和范围,或者如果您尚未定义任何项目,则使用项目默认值
- 同样在.ideainspect 文件中,将ideahome属性设置为您安装IJ 的路径,例如ideahome= C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 15.0.6
- 最后,要将其包含在 Maven 构建中,请将以下内容添加到您的 POM.xml 中:
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.6.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>execute</goal>
</goals>
</execution>
</executions>
<configuration>
<properties>
</properties>
<scripts>
<script>file:///${project.basedir}/idea-cli-inspector/ideainspectMvn.groovy</script>
</scripts>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<!-- any version of Groovy \>= 1.5.0 should work here -->
<version>2.5.0</version>
<type>pom</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</plugin>
故障排除
如果您在运行检查时遇到此 EXCEPTION_ACCESS_VIOLATION 错误,您可以通过在安装了 IJ 的 bin\idea64.exe.vmoptions 文件末尾添加 -Dswing.noxp=true 来修复它 - 修复记录在这个IJ 崩溃线程的结尾。
Gradle 变体
要将它添加到您的 Gradle 构建中,它比在 Maven 案例中更简单。只需将此任务添加到您的 build.gradle 文件中:
task inspect(type:Exec) {
workingDir '/idea-cli-inspector'
//on windows:
commandLine 'cmd', '/c', 'groovy ideainspect.groovy'
}
推荐阅读
- javascript - 如何禁用故事书的键盘快捷键
- mongodb - 使用两个匹配的文件查询 DynamoDB
- python - 如何有效地处理两个python数据帧?
- laravel - 如何将 Laravel 更新到 6?
- r - 使用 dplyr 滚动逐步回归
- reactjs - 如何在 this.state Reactjs 中存储 map() 函数返回的组件数组
- angular - 为什么 {descendants: true} 在 ContentChildren 中不起作用?
- node.js - net.createserver 上的节点 JS 事件发射器
- haskell - 在 Haskell 中有条件地折叠列表的简洁语法
- python - 将整数值从 RPi 串行发送到 Arduino