Проверка контрактов в Maven Build

Я работаю над базой кода Java в IJ и в настоящее время собираюсь с 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. Я хотел бы иметь возможность подключиться к сборке и потерпеть неудачу, если какие-либо контракты нарушаются.

1 ответ

Вот решение, которое работает для IntelliJ Contracts. Это немного грязно, но это работает:

  • Загрузите / клонируйте инструмент инспектора CLI Bentolor в свой рабочий каталог, т.е. в каталог, где находится папка.idea.
  • Создайте профиль проверки IJ, включив только эти проверки: постоянные условия и исключения и проблемы контракта
  • Создайте область проверки, если хотите - это ограничит выполнение проверок только для определенных файлов.
  • Отредактируйте этот файл.ideainspect, который поставляется с инструментом Bentolor, настройте свой профиль проверки и область, которую вы только что определили, или используйте значения по умолчанию для проекта, если вы не определили
  • Также в файле.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 во время выполнения проверок, вы можете исправить ее, добавив -Dswing.noxp=true в конец файла bin\idea64.exe.vmoptions, где установлен IJ, - исправление задокументировано в конец этой ветки.

Gradle Variant

Добавить это в вашу сборку Gradle проще, чем в случае с Maven. Просто добавьте эту задачу в ваш файл build.gradle:

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

  //on windows:
  commandLine 'cmd', '/c', 'groovy ideainspect.groovy'
}
Другие вопросы по тегам