java - Maven 构建中的契约(Contract)检查

标签 java maven jetbrains-ide contract openjml

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

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

  • 注:我只关心这里的编译时可检查契约(Contract)。我有 JUnit 可以用于运行时方面。

    执行契约(Contract):

    我添加了这个部分来回答关于我想要执行什么样的契约(Contract)的评论。理想情况下,我想要最强大的解决方案,条件是该解决方案是完整的。当我在这里说完成时,我的意思是一种契约(Contract)语言和一个契约(Contract)检查器,这样语言中的每个语句都可以在编译时被检查器检查为好/坏。我知道这可能是一个很大的问题,但即使是最简单的契约(Contract),例如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):
    @Contract("null -> !null")
    

    但是有了上面的,人为的,糟糕的契约(Contract),Maven 构建仍然可以正常工作。构建不会获取检查结果 - 这些仅在 IJ 中可见。如果违反任何契约(Contract),我希望能够连接到构建并失败。

    最佳答案

    这是一个适用于 IntelliJ 契约(Contract)的解决方案。这有点乱,但它有效:

  • 下载/克隆 Bentolor's CLI inspector工具进入您的工作目录,即 .idea 文件夹所在的目录
  • Create an IJ inspection profile仅启用这些检查:恒定条件和异常 契约(Contract)问题
  • Create an inspection scope如果您愿意 - 这将限制您的检查仅对某些文件运行
  • 编辑 Bentolor 工具附带的 .ideainspect 文件,设置您刚刚定义的检查配置文件和范围,或者如果您尚未定义任何项目,则使用项目默认值
  • 同样在 .ideainspect 文件中,设置 创意之家属性到您安装 IJ 的路径,例如ideahome= C:\Program Files (x86)\JetBrains\IntelliJ IDEA 社区版 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 变体

    要将其添加到您的 Gradle 构建中,它比在 Maven 情况下更简单。只需将此任务添加到您的 build.gradle 文件中:
    task inspect(type:Exec) {
      workingDir '/idea-cli-inspector'
    
      //on windows:
      commandLine 'cmd', '/c', 'groovy ideainspect.groovy'
    }
    

    关于java - Maven 构建中的契约(Contract)检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50587933/

    相关文章:

    java - 如何在不卡住 GUI 的情况下调用 SwingWorker .get()?

    java - 在Python中迭代字典、列表

    java - 使用三值逻辑变量的最佳方式

    java - 如何将jar包集成到maven项目中

    java - 是否可以在 IntelliJ IDEA 2016 调试器中一键将变量对象列表折叠到特定深度?

    java - 当更改其中一些而不是其他 JButton 的背景颜色时,如何使 JButton 看起来都一样?

    maven - 如何开源 Maven 插件?

    java - 在 pom.xml 中添加 hibernate-search-orm 后出错

    intellij-idea - PhpStorm 未在项目 View 中显示项目文件

    postgresql - 忽略 JetBrains 中的 extra_float_digits 参数