・QFJ 1.6.0 release notes
□ ダウンロードと実行(java version "1.8.0_45")
ビルド済みのバイナリファイルをダウンロード
quickfixj-core-1.6.0.jar
quickfixj-messages-fixXX-1.6.0.jar (必要なバージョン、allなら全部込み)
をパスに指定する。
実行したところ、NewOrderSingleのインスタンス作成時 new NewOrderSingle() に以下のエラーが発生
java.lang.VerifyError: Bad type on operand stack Exception Details: Location: quickfix/fix44/NewOrderSingle.get(Lquickfix/field/SettlType;)Lquickfix/field/SettlType; @2: invokevirtual Reason: Type 'quickfix/field/SettlType' (current frame, stack[1]) is not assignable to 'quickfix/CharField' Current Frame: bci: @2 flags: { } locals: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' } stack: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' } Bytecode: 0x0000000: 2a2b b600 3057 2bb0
SettlType はFIXのバージョンによってQFIX/Jのフィールド種別が異なっているようだ。
FIX4.4ではCharField、FIX5.0ではStringFieldで定義されている。
デフォルトでは、coreに定義されているSettlTypeはStringFieldを拡張している。
VerifyErrorはJDK7以降でclassファイルの検証方式が変更になったことによるものらしい。
既存プロジェクトをJDK8へ移行したら、java.lang.VerifyErrorが出た
とりあえずの解決法はフィールドのそろえればよい。↓のQAにも同様の回答があった。
[Quickfixj-users] Using multiple versions of FIX with Quickfix
□ ビルド
ソースをダウンロードして再ビルドする。
しかし、そのままビルドしたらテストが通らない。。。
原因を探すのが面倒なので、テストスキップでビルド
mvn install -DskipTests=true
全体を一度ビルドした後で、messageの定義を変更して再ビルドする。
使用したいバージョンの定義ファイルを編集する。FIX4.4の場合は以下
quickfixj-messages-fix44\src\main\resources\FIX44.modified.xml
このあたりを変更する
前)メッセージだけビルドして終了↓ 後)
0 件のコメント:
コメントを投稿