联盟链由于其本身的特性,目前应用在一些大型国有企业银行比较多。出于安全考虑,这些企业一般会隔离外网环境。所以在实际生产需求中可能存在需要在一个离线的环境中打包安装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 ]; then
exit $retval
fi
cp build/libs/chaincode.jar $
retval=$?
if [ $retval -ne ]; 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而不用重新下载。满足了内网的需求。

hyperledger fabric 中java chaincode 支持离线打包的更多相关文章

  1. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(一)

    前言 本文主要目的是用于整理Hyperledger  Fabric中关于chaincode 管理和操作的内容,作者以release-1.2为范本进行讲解. 主要参考链接: https://hyperl ...

  2. Hyperledger Fabric中的Identity

    Hyperledger Fabric中的Identity 什么是Identity 区块链网络中存在如下的角色:peers, orderers, client application, administ ...

  3. 在HyperLedger Fabric中启用CouchDB作为State Database

    回顾一下我之前的一篇博客,在Fabric 1.0中,我们存在3种类型的数据存储,一种是基于文件系统的区块链数据,这个跟比特币很像,比特币也是文件形式存储的.Fabric1.0中的区块链存储了Trans ...

  4. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(二)

    本文接上一节是测试部分 搭建一个模拟测试环境 作者将fabric release1.2工程中的 example-e2e进行了改造来进行本次实验: (1)首先我们将examples/e2e_cli/sc ...

  5. 区块链:基于Hyperledger Fabric的 java 客户端开发(java sdk /java api server/java event server)

    fabric针对java 开发的部分支持不是很友好.基于目前较为稳定的fabric 1.4版本,我们封装了一个java sdk,apiserver,eventServer 封装java sdk的主要目 ...

  6. Hyperledger Fabric 中channel配置相关数据结构

    channel Configuration Transaction Hyperledger Fabric区块链网络中的配置存储在一个configuration-transaction的集合中,每个ch ...

  7. Hyperledger Fabric(5)ChainCode的编写步骤

    链码(chaincode) 会对 Fabric应用程序  发送的交易做出响应,执行代码逻辑,与 账本 进行交互. 再复习下他们之间的逻辑关系: Hyperledger Fabric 中,Chainco ...

  8. fabric java chaincode 开发

    链码的开发不部分参考官网demo即可. 本文不会详细介绍开发过程 笔者启动的是一个gradle工程,也就是jar包管理使用的是gradle. chaincode 源码: /* Copyright IB ...

  9. Hyperledger Fabric Chaincode for Operators——实操智能合约

    什么是Chaincode(智能合约)? chaincode是一个程序,它是使用Go语言编写的,最终在Java等其他编程语言中实现了指定的接口.chaincode运行在一个被背书peer进程独立出来的安 ...

随机推荐

  1. 什么是VBA,他有什么作用

    目录 什么是VBA,它有什么作用 VBA在哪里存放的?怎么运行的 什么是宏?宏和VBA有什么关系? 录制一个宏 编写第一个宏 一.什么是VBA,它有什么作用 VBA是一种编程语言,它依托于Office ...

  2. 机器学习:多项式回归(scikit-learn中的多项式回归和 Pipeline)

    一.scikit-learn 中的多项式回归 1)实例过程 模拟数据 import numpy as np import matplotlib.pyplot as plt x = np.random. ...

  3. [置顶] linux getline()函数

    getline()函数是什么?百度百科这样解释:      getline不是C库函数,而是C++库函数.它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束.1) ...

  4. SQL修改日期时间型数据中的年月日

    以下语句为更改 tevent表中的eventtime字段为2011-7-16当eventtime为2012-02-29时 update tevent set  eventtime='2011-7-16 ...

  5. 部署和调优 2.3 tomcat中JDK安装

    目前有很多网站使用 jsp 的程序编写,所以解析 jsp 的程序就必须要有相关的软件来完成.Tomcat 就是用来解析 jsp 程序的一个软件.因为 Tomcat 技术先进.性能稳定,而且免费,因而深 ...

  6. 使用LaTeX按IEEE模板写论文时的参考文献管理方法(BibTeX使用小结)

    之前用LaTeX写论文时,参考文献都是手动添加管理的,真是让人很抓狂.所以这次趁着假期,简单看了一下怎么使用BibTeX对参考文献进行管理,这里以IEEE的最新模板为例. 首先说明,我之前用的是MiK ...

  7. AudioManager 音量『转』

    获取系统音量 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法: publicvoidsetStream ...

  8. TabHost两种不同的实现方式

    第一种:继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.只要定义具体Tab内容布局就行了 第二种:不用继承TabActivity,在布局文件中定 ...

  9. 【总结整理】行内标签span设置position:absolute/float属性可以设置宽度与高度

    postion:absolute 跳出文本流,不是行内元素,设置宽高有效,我的理解. 引用下曹刘阳写的<编写高质量代码-web前端开发修炼之道>一书中看到的一句话:position:abs ...

  10. ArcGIS Field Type /esriFieldTypeDate(转)

    ArcGIS Field Type   The following table outlines the equivalent field data types in ArcCatalog, ArcO ...