Проверка контракта в Maven Build - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над базой кода Java в IJ и в настоящее время собираюсь с Maven.Я хотел бы дополнить некоторые части кода контрактами , которые будут получены в сборке Maven .До сих пор мне не удавалось в поисках такой возможности с полки:

  • OpenJML , но, похоже, требуется собственный инструмент для анализа вашего кода, и яне удалось найти способ легко интегрировать его в сборку.
  • Jetbrains Contracts .Они вызовут предупреждение в IntelliJ посредством проверки, но они не влияют на сборку.

Примечание: Меня интересуют только проверяемые во время компиляции контракты здесь.У меня есть JUnit, чтобы бросить на стороне выполнения вещей.

Контракты для Enforce:

Я добавил этот раздел, чтобы ответить на комментарий, спрашивая, какие контракты яхотел бы обеспечить соблюдение.В идеале я хотел бы, чтобы наиболее мощное решение, которое возможно при условии, что это решение complete .Когда я говорю здесь «завершить», я имею в виду язык контрактов и средство проверки контракта, так что каждое утверждение на этом языке может быть проверено проверяющим как хорошее / плохое во время компиляции.Я знаю, что это может быть большой проблемой, но я был бы рад даже самым простым контрактам, например , предлагаемым 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 голосов
/ 20 июня 2018

Вот решение, которое работает для 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>

Проблемыhooting

Если вы получите эту ошибку EXCEPTION_ACCESS_VIOLATION во время выполнения проверок, вы можете исправить ее, добавив -Dswing.noxp = true в конец файла bin \ idea64.exe.vmoptions, где установлен IJ - исправление задокументировано в конце этого аварийного потока IJ .

Gradle Variant

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

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

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