Maven Build中的合同检查

时间:2018-05-29 15:23:09

标签: maven jetbrains-ide contract jml openjml

我正在IJ的Java代码库上工作,目前正在使用Maven构建。我想用某种形式的合同补充一些代码,这些合同将在Maven构建中被选中。到目前为止,我在寻找现成的这种功能方面没有成功:

  • OpenJML,但这似乎需要自己的工具来分析您的代码,而我无法找到将其轻松集成到构建中的方法。
  • Jetbrains Contracts。这些将通过检查在IntelliJ中发出警告,但它们不会影响构建。

注意:我只关心编译时可检查合同。我有JUnit在运行时抛出一些东西。

与强制合同:

我已添加此部分来回答评论,询问我希望执行哪种合同。理想情况下,我喜欢最强大的解决方案,条件是该解决方案完成。当我在这里说完,我的意思是合同语言和合同检查器,以便在编译时由检查员检查语言中的每个语句是好还是坏。我知道这可能是一个很大的问题,但即使是最简单的合同,我也会感到高兴,例如: those offered by 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内部看到。我希望能够挂钩构建并在违反任何合同时失败。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案,适用于IntelliJ Contracts。有点混乱,但是可以用:

  • Bentolor's CLI inspector工具下载/克隆到您的工作目录中,即.idea文件夹所在的目录中
  • Create an IJ inspection profile仅启用了以下检查:恒定条件和例外情况合同问题
  • Create an inspection scope(如果您愿意)-这将限制您的检查仅在某些文件上运行
  • 编辑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>

问题排查

如果在运行检查时得到this EXCEPTION_ACCESS_VIOLATION bug,则可以通过在安装IJ的文件bin \ idea64.exe.vmoptions的末尾添加-Dswing.noxp = true来解决此问题。修复程序记录在此IJ crash thread的末尾。

版本变体

要将其添加到您的Gradle构建中,比在Maven中更简单。只需将此任务添加到您的build.gradle文件中即可:

task inspect(type:Exec) {
  workingDir '/idea-cli-inspector'

  //on windows:
  commandLine 'cmd', '/c', 'groovy ideainspect.groovy'
}