HFC_SDK（1.3）とJava11の相性はそこまで良くなかったので簡単に対応した話

# 2018/10/29（月）追記




# はじめに
タイトル通りです。

Java11で、HyperledgerFabricClient_SDK（HFC_SDK）の1.3系を使おうとしたら、少しハマったのでメモ。


公式では、「Java8以降を使いましょう」と書いてあったので、安易に「Java11でも行けるじゃん」と思ったら、素直にはいけませんでした。
Java9でいろいろとDeprecateされたことが原因のようです。

ブロックチェーンでのアプリやシステム開発というと、Ethereumのほうが有名ですが、パブリックで使う予定もなく、Javaエンジニアなので、とっつきやすそうなHyperledgerFabricを使っています。

# 書いてないこと
* 各種インストール方法、使い方

# 環境
* macOS High Sierra 10.13.6
* Java11
* Hyperledger Fabric 1.3
* Apache Maven 3.5.4

# HFC_SDKのインストール
## ダウンロード
* 公式GitHub参照
	* https://github.com/hyperledger/fabric-sdk-java#checkout-sdk-from-github
* 難しいことなんてことはなく、gitからクローンします。
	* `git clone https://github.com/hyperledger/fabric-sdk-java.git`
* ディレクトリを移動します
	* `cd fabric-sdk-java/`
* バージョンを変更したい場合は、コマンド一発いれるのですが、変更しないのでこのままです

## jarの作成
* 本来なら`mvn install`などを実行すれば`./target`配下にjarが作成されるのですが、下記のようなエラーが吐き散らかされました。（一部抜粋）

```
$ mvn install
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /fabric-sdk-java/target/generated-sources/protobuf/grpc-java/org/hyperledger/fabric/protos/peer/EventsGrpc.java:[23,18] シンボルを見つけられません
  シンボル:   クラス Generated
  場所: パッケージ javax.annotation
[ERROR] /fabric-sdk-java/src/main/java/org/hyperledger/fabric/sdk/transaction/ProtoUtils.java:[23,22] パッケージjavax.xml.bindは存在しません
[ERROR] /fabric-sdk-java/src/main/java/org/hyperledger/fabric/sdk/EventHub.java:[24,22] パッケージjavax.xml.bindは存在しません
[ERROR] /fabric-sdk-java/src/main/java/org/hyperledger/fabric/sdk/ProposalResponse.java:[10,22] パッケージjavax.xml.bindは存在しません
[ERROR] /fabric-sdk-java/target/generated-sources/protobuf/grpc-java/org/hyperledger/fabric/protos/peer/EndorserGrpc.java:[20,18] シンボルを見つけられません
  シンボル:   クラス Generated
  場所: パッケージ javax.annotation
[ERROR] /fabric-sdk-java/src/main/java/org/hyperledger/fabric/sdk/transaction/LSCCProposalBuilder.java:[20,35] パッケージorg.omg.CORBA.DynAnyPackageは存在しません

```

* `javax.xml.bind`と`javax.annotation`と`org.omg.CORBA.DynAnyPackage`が無いと言っているようです。
	* `pom.xml`に依存関係を追加してあげました。
	* バージョンは適宜変更してください
		* `javax.xml.bind`：https://search.maven.org/artifact/javax.xml.bind/jaxb-api/2.3.0/jar
		* `javax.annotation`：https://search.maven.org/artifact/javax.annotation/javax.annotation-api/1.3.2/jar

```
// pom.xml 
<!-- https://search.maven.org/artifact/javax.xml.bind/jaxb-api/2.3.0/jar -->
<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

<!-- https://search.maven.org/artifact/javax.annotation/javax.annotation-api/1.3.2/jar -->
<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>
```
* 同様に、`org.omg.CORBA.DynAnyPackage`も追加しようと思いましたが、どうやらサポートされていないようです。
	* ログを見る限り、使用しているファイルは1つだけで、特に使っていなさそうなので、`import`文を削除してしまいます。

```
$ vi /fabric-sdk-java/src/main/java/org/hyperledger/fabric/sdk/transaction/LSCCProposalBuilder.java

package org.hyperledger.fabric.sdk.transaction;

import org.hyperledger.fabric.protos.peer.Chaincode;
import org.hyperledger.fabric.protos.peer.FabricProposal;
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
import org.hyperledger.fabric.sdk.exception.ProposalException;
import org.omg.CORBA.DynAnyPackage.Invalid; // ←これを削除する

import static org.hyperledger.fabric.protos.peer.Chaincode.ChaincodeSpec.Type.GOLANG;

public class LSCCProposalBuilder extends ProposalBuilder {
```

* 改めて、コマンドを実行します。なお、（絶大な信頼の元）テストはスキップしています。
	* `mvn install -DskipTests`

```
$ mvn install -DskipTests
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Detecting the operating system and CPU architecture
[INFO] ------------------------------------------------------------------------
[INFO] os.detected.name: osx
[INFO] os.detected.arch: x86_64
[INFO] os.detected.classifier: osx-x86_64
[INFO] 
[INFO] ----------< org.hyperledger.fabric-sdk-java:fabric-sdk-java >-----------
[INFO] Building fabric-java-sdk 1.3.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------

略

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 44.412 s
[INFO] Finished at: 2018-10-25T10:30:43+09:00
[INFO] ------------------------------------------------------------------------
```

* 確認してみます

```
$ ls -l target
total 5984
-rw-r--r--   1 nobkovskii  staff    25539 10 25 10:30 checkstyle-cachefile
-rw-r--r--   1 nobkovskii  staff     6637 10 25 10:30 checkstyle-checker.xml
-rw-r--r--   1 nobkovskii  staff    27946 10 25 10:30 checkstyle-result.xml
drwxr-xr-x   5 nobkovskii  staff      160 10 25 10:25 classes
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:26 coverage-reports
drwxr-xr-x   2 nobkovskii  staff       64 10 25 10:26 diagDump
-rw-r--r--   1 nobkovskii  staff  2998085 10 25 10:30 fabric-sdk-java-1.3.0-SNAPSHOT.jar
drwxr-xr-x   4 nobkovskii  staff      128 10 25 10:10 generated-sources
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:26 generated-test-sources
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:30 maven-archiver
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:10 maven-status
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:30 protoc-dependencies
drwxr-xr-x   4 nobkovskii  staff      128 10 25 10:10 protoc-plugins
drwxr-xr-x   3 nobkovskii  staff       96 10 25 10:30 site
drwxr-xr-x  17 nobkovskii  staff      544 10 25 10:26 test-classes
```

* 無事`fabric-sdk-java-1.3.0-SNAPSHOT.jar`が作成されていますね。あとは、このjarを各々のIDEになどでインポートしましょう。
	* ※そもそも、このjarってどっかに落ちてたりするのかしら・・・

---

今回はここまでです。

ユーザが少ないのか、情報が少なくて寂しい。
Ethereumもいいけど、HyperledgerFabricも触ろうぜ！！
次回は、Javaとの連携とか書きたいなぁ。

ありがとうございました。