hyperledger fabric(分布式账本)由于其本身的特性,目前主要应用于大型国企和银行,其环境的部署一般是与外部网络隔离的。如果采用docker的部署方式,docker镜像可以通过导入即可,但是在安装和实例化的时候需要下载相应的依赖,而且在1.4的环境中,fabric实例化链码需要使用到shadowJar插件。
如何将 Java链码工程所需要的依赖引入工程指定路径下
解决方案
目前网上能找到的解决方案是修改javaenv镜像的dockerfile,将shadowJar插件的依赖直接在生成javaenv镜像文件的时候加载(这就需要改镜像了,看起来就很复杂,我很赖,所以你懂得)。测试这种方法的时候发现在重新生成javaenv镜像文件的时候会缺少一些文件,导致生成的镜像不可用。
参考文章地址:http://www.bubuko.com/infodetail-3024199.html
于是较为简单的方法是将所有依赖下载到指定目录下:
build.gradle
文件内容:
/*
* Copyright IBM Corp. 2018 All Rights Reserved.
* 解决Fabric 链码 离线安装问题:将所依赖JAR包统一放入libs下
* Author: cuixiangyang
* Date: 2020-02-13
* SPDX-License-Identifier: Apache-2.0
*/
plugins {
id 'com.github.johnrengelman.shadow' version '2.0.3'
id 'java'
}
/*buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.3'
}
}
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
*/
group 'org.hyperledger.fabric-chaincode-java'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenLocal()
/*flatDir{
dirs 'libs'
}*/
mavenCentral()
maven {
url "https://repository.mulesoft.org/nexus/content/repositories/public/"
}
}
dependencies {
compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '1.+'
testCompile group: 'junit', name: 'junit', version: '4.12'
compile fileTree(dir:'libs',include:['*.jar'])
}
shadowJar {
baseName = 'chaincode'
version = null
classifier = null
manifest {
attributes 'Main-Class': 'org.hyperledger.fabric.example.SimpleChaincode'
}
}
//将依赖的jar包导入到项目的libs目录下
task copyJars(type: Copy) {
from configurations.runtime
into 'libs' // 目标位置
}
build.dependsOn(copyJars)
然后Eclipse控制台(我是在Eclipse安装了Gradle插件和Maven插件)先后执行clean和build
在Console控制台,出现如下日志输出(只提出了执行clean的日志输出,build的和他一样,输出SUCCESSFUL即成功)
然后在工程libs目录下,可以看到Gradle Java链码工程依赖的JAR包
然后将工程上传Linux Fabric环境,由于环境是内网环境,无法联网,所以需要修改build.gradle文件,将请求网络获取依赖Jar包的配置注释,然后放开优先从本地指定目录获取依赖的配置。
/*
* Copyright IBM Corp. 2018 All Rights Reserved.
* 解决Fabric 链码 离线安装问题:将所依赖JAR包统一放入libs下
* Author: cuixiangyang
* Date: 2020-02-13
* SPDX-License-Identifier: Apache-2.0
*/
plugins {
id 'com.github.johnrengelman.shadow' version '2.0.3'
id 'java'
}
/*buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.3'
}
}
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
*/
group 'org.hyperledger.fabric-chaincode-java'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenLocal()
flatDir{
dirs 'libs'
}
/*
mavenCentral()
maven {
url "https://repository.mulesoft.org/nexus/content/repositories/public/"
}*/
}
dependencies {
/*
compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '1.+'
testCompile group: 'junit', name: 'junit', version: '4.12'*/
compile fileTree(dir:'libs',include:['*.jar'])
}
shadowJar {
baseName = 'chaincode'
version = null
classifier = null
manifest {
attributes 'Main-Class': 'org.hyperledger.fabric.example.SimpleChaincode'
}
}
//将依赖的jar包导入到项目的libs目录下
task copyJars(type: Copy) {
from configurations.runtime
into 'libs' // 目标位置
}
build.dependsOn(copyJars)
然后上传至Fabric网络环境,进行离线安装。
参考博客:
gradle在build的时候找不到某个jar包的解决办法
离线安装和实例化fabric java chaincode
离线安装和实例化fabric java chaincode
作者:李晓LOVE向阳