如何在 Cofoja 中使用离线字节码编写器?

How to use offline bytecode writer with Cofoja?

我正在尝试使用 GitHub 页面的 Cofoja (contracts for Java). I cannot seem to get the contracts in the compiled class file using the offline bytecode writer (this feature is briefly mentioned in the Invocation 部分对我的代码进行离线检测。我执行生成的 class 文件并故意使合同失败。什么都没发生。

这是我的 Java 代码...在我的主要代码中,我只是做了类似的事情:return divide(10, 0);

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

然后我执行以下操作:

我通过我的 IDE、Intellij 构建 .java 文件并获取 class 文件。
然后像这样执行离线字节码编写器:

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" 生成包含合同的 class 文件的正确步骤?

为了以后参考,我去看了com.google.java.contract.core.agent.PreMain的源代码。事实证明,它希望合同文件和帮助文件与常规 java class 文件位于同一位置。一旦我将 class 文件与合同文件(在同一目录中)包含在一起,它就开始工作了。
回顾一下:

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 classes和cofoja合约文件。确保 class 文件与 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 文件。请注意,您需要将所有原始 class 文件的列表作为最后一个命令的参数,并确保合约文件和帮助文件位于相应的 class 文件旁边。