Проверка контрактов в 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'
}