hyperledger fabric 中java chaincode 支持离线打包

联盟链由于其本身的特性,目前应用在一些大型国有企业银行比较多。出于安全考虑,这些企业一般会隔离外网环境。所以在实际生产需求中可能存在需要在一个离线的环境中打包安装chaincode的情况。

本文基于这个需求而编写。

java env 镜像源码:https://github.com/hyperledger/fabric-chaincode-java/tree/release-1.4/fabric-chaincode-docker

我使用的是java chaincode。目前fabric中的java chaincode  支持 gradle 工程和maven 工程。以gradle工程为例;

打包chaincode的过程中,会需要去网络中下载 build.gradle 或者 pom.xml 文件中的jar包。在最初的1.1版本中,这个问题很好解决,只需要修改gradle的配置,使其定位项目相对路径,定义一个文件夹,手动把需要的jar包放进去即可。在 build.gradle 中做如下配置,注释掉的是之前通过网络引用的。

然后在工程中和src平级新建一个libs文件夹,把需要的jar包手动放进去即可。

然而在1.4环境中,fabric对java chaincode的gradle工程打包都需要用到一个 shadow的打包插件。如果查看javaenv的源码会发现在build.sh中有:

buildGradle() {
    cd "$1" > /dev/null
    echo "Gradle build"
    gradle build shadowJar
    retval=$?
    if [ $retval -ne 0 ]; then
      exit $retval
    fi
    cp build/libs/chaincode.jar $2
    retval=$?
    if [ $retval -ne 0 ]; then
      exit $retval
    fi
    cd "$SAVED" >/dev/null
}

这里指定了shadowJar的插件。然而目前我还没发现可以在项目组通过配置文件引用本地shadow.jar。笔者最初考虑是下载shadow的插件源码作为工程的一部分,类似自定义插件的形式。然而发现插件中还有依赖的其他的jar,一环扣一环。所以转换了思路,修改了官方提供的javaenv 镜像的源码,重新通过docker编译。

关于1.4的javaenv的源码:https://github.com/hyperledger/fabric-chaincode-java/tree/release-1.4/fabric-chaincode-docker

修改了两个地方:

Dockerfile文件中,在  #Making scripts runnable

COPY start /root/chaincode-java

COPY build.sh /root/chaincode-java

不然会报错找不到这两个文件。然后在#Removing non-needed sources前面添加:
RUN wget http://repo.spring.io/plugins-release/com/github/jengelman/gradle/plugins/shadow/2.0.3/shadow-2.0.3.pom
RUN wget http://repo.spring.io/plugins-release/com/github/jengelman/gradle/plugins/shadow/2.0.3/shadow-2.0.3.jar
RUN source /root/.sdkman/bin/sdkman-init.sh; mvn install::install-file -Dfile=shadow-2.0.3.jar -DpomFile=shadow-2.0.3.pom

这一步的目的是在构建镜像的时候下载shadow,并且跟本地maven环境相关联。这样工程里在找shadow jar的时候就会有优先找到本地的jar而不用重新下载。满足了内网的需求。

posted @ 2019-04-15 16:12  像我这样的人  阅读(731)  评论(0编辑  收藏  举报