Как использовать автономный писатель байт-кода с Cofoja?

Я пытаюсь сделать офлайн инструментарий моего кода с помощью Cofoja (контракты на Java). Кажется, я не могу получить контракты в скомпилированном файле класса с помощью автономного средства записи байт-кода (эта функция кратко упоминается в разделе " Вызов " на странице GitHub). Я выполняю полученный файл класса и намеренно не выполняю контракт. Ничего не произошло.

Вот мой Java-код... В основном я делаю что-то вроде: return divide(10, 0);

  @Requires("y != 0")
  public static int divide(int x, int y)
  {
    return x / y;
  }

Затем я делаю следующее:

Я строю файл.java через мою среду разработки Intellij и получаю файл класса.
Затем выполните автономную запись байт-кода следующим образом:

java -Dcom.google.java.contract.classoutput=cofoja -cp cofoja.asm-1.2-20140817.jar com.google.java.contract.core.agent.PreMain JavaTest.class

В результате в каталоге "cofoja" создается другой файл "JavaTest.class". Однако, когда я выполняю это, я не вижу никаких ошибок контракта.

Кто-нибудь знает правильные шаги для использования "com.google.java.contract.core.agent.PreMain" для создания файлов классов с заключенными в них контрактами?

1 ответ

Решение

Просто для дальнейшего ознакомления, я пошел и посмотрел исходный код для com.google.java.contract.core.agent.PreMain. Оказывается, он ожидает, что файлы контрактов и вспомогательные файлы будут жить в том же месте, что и ваши обычные файлы классов Java. Когда я включил файлы классов вместе с файлами контрактов (в том же каталоге), это начало работать.
Итак, резюмируем:

java -d {output_dir} -cp {your_classpath} "-Acom.google.java.contract.classoutput={output_dir}" "-Acom.google.java.contract.classpath={your_classpath}" "-Acom.google.java.contract.sourcepath={your_sources_dir}" -processor com.google.java.contract.core.apt.AnnotationProcessor

составить Java-классы и файлы контрактов cofoja. Убедитесь, что файлы классов находятся в том же каталоге, что и файлы контрактов cofoja.
Затем выполните это:

java -Dcom.google.java.contract.classoutput={output_dir} -cp cofoja.asm-1.2-20140817.jar com.google.java.contract.core.agent.PreMain {all .class files separated by spaces}

Эта команда создаст отдельные файлы.class со встроенными контрактами, которые затем можно будет скомпилировать в файл jar. Обратите внимание, что вам необходимо иметь список всех ваших исходных файлов классов в качестве аргументов последней команды и убедиться, что файлы контрактов и вспомогательные файлы находятся рядом с соответствующим файлом классов.

Другие вопросы по тегам