构建一个 CorDapp

CorDapp 运行在 Corda 平台上并且跟其他的节点互相交互。这篇文章介绍了如何构建一个 CorDapp。如果想了解什么是 CorDapp,请阅读 什么是 CorDapp

CorDapp 格式

一个 CorDapp 是一个 semi-fat JAR,它包含了所有 CorDapp 的依赖库(除了 Corda 核心库和它所依赖的其他 CorDapp)。

比如,如果一个 CorDapp 依赖于 corda-coreyour-other-cordappapache-commons,那么这个 CorDapp JAR 将会包括:

  • 来自于 apache-commons 的所有类和资源以及他们的依赖项
  • 没有任何从其他两个 JARs 来的东西

构建工具 Build tools

在下边的指导介绍中,我们假设你正在使用 gradlecordformation plugin 来构建你的 CorDapp。

设置你的依赖项

选择 Corda 版本

ext.corda_release_versionext.corda_gradle_plugins_versionbuild.gradle 被用来定义 Corda 和 Corda Gradle Plugins 的版本,来构建你的 CorDapp。
比如,要使用 Corda 1.0 版本和 Corda gradle plugins 1.0 版本,你需要按照下边的定义:

ext.corda_release_version = '1.0.0'
ext.corda_gradle_plugins_version = '1.0.0'

你可以在 https://bintray.com/r3/corda 中找到这两部分最新的发布版本。

corda_gradle_plugins_versions 是以 major.minor.patch 形式来指定的。你应该使用和 Corda 版本相同的 majorminor 版本,并且使用最新的 patch 版本。可用版本的列表可以在 https://bintray.com/r3/corda/cordformation 找到。

Corda 依赖项

cordformation plugin 添加了两个新的 gradle 配置:

  • cordaCompile, 扩展了 compile
  • cordaRuntime, 扩展了 runtime

为了同 Corda 对应,你必须在 build.gradle 中添加下边的代码:

  • net.corda:corda:$corda_release_version 作为 cordaRuntime 依赖项
  • 每个 Corda 编译依赖项(比如 net.corda:corda-core:$corda_release_version)作为 cordaCompile 依赖项

你可能还会添加:

  • net.corda:corda-test-utils:$corda_release_version 作为 testCompile 依赖项,为了使用 Corda 的测试框架
  • net.corda:corda-webserver:$corda_release_version 作为 cordaRuntime 依赖项,为了使用 Corda 内置的开发 webserver

对于其他 CorDapps 的依赖项

你的 CorDapp 还有可能会依赖于其他的 CorDapp 中定义的类,比如 states,contracts 和 flows。有两种方式可以在你的 CorDapp 的 build.gradle 文件中添加对其他 CorDapp 的依赖:

  • cordapp project(“:another-cordapp”)(如果其他的 CorDapp 是在同一个项目中以另外一个模块的形式定义的话,使用这个方法)
  • cordapp “net.corda:another-cordapp:1.0”(如果不属于上边的情况)

其他的依赖项

如果你的 CorDapp 还有任何其他的外部依赖,它可以在 Gradle 中像常规的 Kotlin/Java 依赖项那样来指定。下边的例子指定了 apache-commons

例子

下边的例子演示了对于一个 CorDapp gradle 依赖应该定义成什么样子。CorDapp 默认已经正确的做好了配置,所以下边的仅仅作为参考:

dependencies {
    // Corda integration dependencies
    cordaCompile "net.corda:corda-core:$corda_release_version"
    cordaCompile "net.corda:corda-finance:$corda_release_version"
    cordaCompile "net.corda:corda-jackson:$corda_release_version"
    cordaCompile "net.corda:corda-rpc:$corda_release_version"
    cordaCompile "net.corda:corda-node-api:$corda_release_version"
    cordaCompile "net.corda:corda-webserver-impl:$corda_release_version"
    cordaRuntime "net.corda:corda:$corda_release_version"
    cordaRuntime "net.corda:corda-webserver:$corda_release_version"
    testCompile "net.corda:corda-test-utils:$corda_release_version"

    // Corda Plugins: dependent flows and services
    // Identifying a CorDapp by its module in the same project.
    cordapp project(":cordapp-contracts-states")
    // Identifying a CorDapp by its fully-qualified name.
    cordapp "net.corda:bank-of-corda-demo:1.0"

    // Some other dependencies
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
    testCompile "junit:junit:$junit_version"

    compile "org.apache.commons:commons-lang3:3.6"
}

创建 CorDapp JAR

当你的依赖项设置好了之后,就可以用 gradle 的 jar 任务来创建你的 CorDapp JAR 了:

  • Unix/Mac OSX:./gradlew jar
  • Windows:gradlew.bat jar

CorDapp JAR 文件会被放置到 build/libs 文件夹。

JAR 文件的文件名必须要包含一个唯一的标识符,用来同相同 CorDapp 的其他版本区分开。这个通常是在 CorDapp 名字的后边附加上版本号字符串。这个唯一标识符当一个 JAR 被部署到节点上之后就不应该改变了。如果它真的被改了,要确保没有节点在他们的 flows 里会依赖于 FlowContext.appName

安装 CorDapp JAR

注意:在安装 CorDapp 之前,你必须要创建一个或多个节点来安装它。

在运行时,节点会加载放在它的 puglins 文件夹下的任何 CorDapps。因此为了在一个节点上安装一个 CorDapp,CorDapp JAR 必须要被添加到 <node_dir>/plugins/ 文件夹,node_dir 是存储 节点的 JAR 和 配置文件的路径。

发表评论

电子邮件地址不会被公开。 必填项已用*标注