hyperledgerfabric中javachaincode⽀持离线打包
联盟链由于其本⾝的特性,⽬前应⽤在⼀些⼤型国有企业银⾏⽐较多。出于安全考虑,这些企业⼀般会隔离外⽹环境。所以在实际⽣产需求中可能存在需要在⼀个离线的环境中打包安装chaincode的情况。
本⽂基于这个需求⽽编写。
java env 镜像源码:github/hyperledger/fabric-chaincode-java/tree/release-1.4/fabric-chaincode-docker
我使⽤的是java chaincode。⽬前fabric中的java chaincode  ⽀持 gradle ⼯程和maven ⼯程。以gradle⼯程为例;
打包chaincode的过程中,会需要去⽹络中下载 adle 或者 l ⽂件中的jar包。在最初的1.1版本中,这个问题很好解决,只需要修改gradle的配置,使其定位项⽬相对路径,定义⼀个⽂件夹,⼿动把需要的jar包放进去即可。在 adle 中做如下配置,注释掉的是之前通过⽹络引⽤的。
然后在⼯程中和src平级新建⼀个libs⽂件夹,把需要的jar包⼿动放进去即可。
然⽽在1.4环境中,fabric对java chaincode的gradle⼯程打包都需要⽤到⼀个 shadow的打包插件。如果查看javaenv的源码会发现在build.sh 中有:
buildGradle() {
cd "$1" > /dev/nullmaven打包本地jar包
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的源码:github/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 repo.spring.io/plugins-release/com/github/jengelman/gradle/plugins/shadow/2.0.3/shadow-2.0.3.pom
RUN wget 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⽽不⽤重新下载。满⾜了内⽹的需求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。