首页 > 解决方案 > Maven 构建中的合同检查

问题描述

我正在 IJ 中开发 Java 代码库,目前正在使用 Maven 构建。我想用某种形式的合同来补充一些代码,这些合同将在 Maven 构建中获得。到目前为止,我一直没有成功寻找这种现成的功能:

注意:我只关心编译时可检查的合约。我有 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 内可见。如果违反任何合同,我希望能够参与构建并失败。

标签: javamavenjetbrains-idecontractopenjml

解决方案


这是一个适用于 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'
}

推荐阅读