swift是一个用于创建thrift 序列化类型和服务的java工具库,使用swfit可以生成非常简洁的java代码。并且更重要的是可以通过java代码生成接口描述文件(Thrift interface description language,IDL).
多数情况下,服务端的应用都是java写的。使用swift提供的工具,可以直接生成IDL,再用IDL生成其他语言的client端代码 (java,cpp,python…)

下面的TestService.java定义了一个简单的服务接口,本文以实例的例子说明将这个服务接口生成thrift client端代码的过程:
TestService.java

package net.gdface.facelog;
import com.facebook.swift.service.ThriftMethod;
import com.facebook.swift.service.ThriftService;
@ThriftService
public interface TestService {
    @ThriftMethod
    public void setBean(TestBean bean);
    @ThriftMethod
    public TestBean getBean() throws ServiceRuntime;
}

TestBean.java

package net.gdface.facelog;
import com.facebook.swift.codec.ThriftField;
import com.facebook.swift.codec.ThriftStruct;

@ThriftStruct
public final class TestBean{
    private Integer id;
    public TestBean() {
    }
    @ThriftField(1)
    public Integer getId() {
        return id;
    }
    @ThriftField()
    public void setId(Integer id) {
        this.id = id;
    }
}

下载Swift2Thrift Code Generator

我们首先要从TestService.java生成 IDL文件。这需要用到swift提供的工具:Swift2Thrift Code Generator
为了便于在命令行执行,要下载包含所有依赖库的standalone版本

URL地址下载

maven仓库 0.14.2 standalone版本下载地址 :
http://central.maven.org/maven2/com/facebook/swift/swift2thrift-generator-cli/0.14.2/swift2thrift-generator-cli-0.14.2-standalone.jar

maven命令下载

执行maven命令下载swift2thrift-generator-cli-0.14.2-standalone.jar到lib文件夹下
(‘^’是windows shell下的分行符,linux shell下请将 ‘^’ 换成 ‘\’)

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get ^
  -DremoteRepositories=central::default::http://repo1.maven.apache.org/maven2 ^
  -Dartifact=com.facebook.swift:swift2thrift-generator-cli:0.14.2:jar:standalone ^
  -Ddest=lib/swift2thrift-generator-cli-0.14.2-standalone.jar

这里-Dartifact参数中的 0.14.2是指定swift的版本号,如果换成RELEASE,则下载当前最高版本。
但是swift 0.14.2以后的版本都是java1.8编译的。而我用的java是1.7,所以这里必须指定版本号。
-Ddest指定保存jar包的路径,如果不指定,则下载到maven本地仓库中。
-DremoteRepositories 指定远程仓库,可省略此参数

[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building facelog-main 1.0-SNAPSHOT
[INFO] ————————————————————————
[INFO]
[INFO] — maven-dependency-plugin:2.8:get (default-cli) @ facelog-main —
[INFO] Resolving com.facebook.swift:swift2thrift-generator-cli:jar:standalone:0.
14.2 with transitive dependencies
Downloading: http://maven.aliyun.com/nexus/content/groups/public/com/facebook/sw
ift/swift2thrift-generator-cli/0.14.2/swift2thrift-generator-cli-0.14.2.pom
Downloaded: http://maven.aliyun.com/nexus/content/groups/public/com/facebook/swi
ft/swift2thrift-generator-cli/0.14.2/swift2thrift-generator-cli-0.14.2.pom (2.8
kB at 5.3 kB/s)
Downloading: http://maven.aliyun.com/nexus/content/groups/public/com/facebook/sw
ift/swift2thrift-generator-cli/0.14.2/swift2thrift-generator-cli-0.14.2-standalo
ne.jar
Downloaded: http://maven.aliyun.com/nexus/content/groups/public/com/facebook/swi
ft/swift2thrift-generator-cli/0.14.2/swift2thrift-generator-cli-0.14.2-standalon
e.jar (11 MB at 616 kB/s)
[WARNING] destination/dest parameter is deprecated: it will disappear in future
version.
[INFO] copying J:\maven_repository\com\facebook\swift\swift2thrift-generator-cli
\0.14.2\swift2thrift-generator-cli-0.14.2-standalone.jar to J:\facelog\facelog-m
ain\lib\swift2thrift-generator-cli-0.14.2-standalone.jar
[WARNING] Notice transitive dependencies won’t be copied.
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 20.526 s
[INFO] Finished at: 2017-10-11T15:58:03+08:00
[INFO] Final Memory: 15M/436M
[INFO] ————————————————————————

生成 IDL文件

命令行执行如下命令生成IDL文件 TestService.thrift

java -cp lib\swift2thrift-generator-cli-0.14.2-standalone.jar;target\test-classes ^
    com.facebook.swift.generator.swift2thrift.Main ^
    -package net.gdface.facelog ^
    TestService  ^
    -namespace py gdface.thrift -namespace java com.gdface -namespace cpp gdface ^
    -out TestService.thrift ^
    -recursive

生成的TestService.thrift,文件中不仅有TestService的定义还有涉及的类型TestBean的定义:

namespace java.swift net.gdface.facelog
namespace py gdface.thrift
namespace java com.gdface
namespace cpp gdface
struct TestBean {
  1:  i32 id;
}

service TestService {
  TestBean getBean();
  void setBean(1:  TestBean arg0);
}

关于Swift2Thrift Code Generator的大部分的命令行参数说明参见Swift2Thrift Code Generator
但是 -recursive 这个参数,官方网站并没有说明,只有执行java -jar lib\swift2thrift-generator-cli-0.14.2-standalone.jar时才会显示:

J:\facelog\facelog-main>java -jar lib\swift2thrift-generator-cli-0.14.2-standalo
ne.jar
Usage: Swift2ThriftGenerator [options] <swift-class-name...>
  Options:
    -allow_multiple_packages
       Allow input classes to reside in different packages. The value of this
       flag defines the generated java.swift namespace. Note that Swift classes
       generated from the resultant Thrift file will all reside in one Java pack
age
    -package,-default_package
       Default package for unqualified classes
       Default: <empty string>
    -map
       Map of external type or service to include file
    -namespace
       Namespace for a particular language to include
    -out
       Thrift IDL output file,defaults to stdout
    -recursive
       Generate all types transitively reachable from the specified types and
       services       
       Default: false
    -v,-verbose
       Show verbose messages
       Default: false

-recursive是指定递归生成所有service接口中涉及的数据类型的IDL定义。这个参数很重要。
比如本例中TestService.java中还涉及到TestBean.java类,如果没有这个参数,还需要单独为TestBean.java再执行一次Swift2ThriftGenerator生成 IDL,并且要在生成TestService.java的IDL时还要用-map告诉程序TestBean的IDL文件的位置,如果service接口中有多个自定的类型的时候,代码维护就非常麻烦。
有了这个参数,只要对service接口类型执行一次Swift2ThriftGenerator就可以生成完整的IDL定义文件。

下载Swift Code Generator Tool

有了前面生成的IDL文件( TestService.thrift)。就可以用swift提供的另一个工具:Swift Code Generator Tool来生成Client代码了.

Swift Code Generator Tool的下载方式与Swift2Thrift Code Generator差不多:

url下载

maven仓库 0.14.2 standalone版本下载地址 :
http://central.maven.org/maven2/com/facebook/swift/swift-generator-cli/0.14.2/swift-generator-cli-0.14.2-standalone.jar

maven命令下载

执行maven命令下载swift-generator-cli-0.14.2-standalone.jar到lib文件夹下

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get ^
  -Dartifact=com.facebook.swift:swift-generator-cli:0.14.2:jar:standalone ^
  -Ddest=lib/swift-generator-cli-0.14.2-standalone.jar

生成Client代码

java -jar lib\swift-generator-cli-0.14.2-standalone.jar ^
    TestService.thrift ^
    -generate_beans ^
    -override_package net.gdface.facelog.client ^
    -out client/java

-override_package 参数用于指定生成代码的包名,可不指定,则默认使用thrift文件中定义的package
-out 指定代码生成文件夹
-generate_beans 指定将数据对象生成标准Java Bean

生成的service端接口代码
TestService.java

package net.gdface.facelog.client;

import com.facebook.swift.codec.*;
import com.facebook.swift.codec.ThriftField.requiredness;
import com.facebook.swift.service.*;
import com.google.common.util.concurrent.ListenableFuture;
import java.io.*;
import java.util.*;

@ThriftService("TestService")
public interface TestService
{
    @ThriftService("TestService")
    public interface Async
    {
        @ThriftMethod(value = "getBean")
        ListenableFuture<TestBean> getBean();

        @ThriftMethod(value = "setBean")
        ListenableFuture<Void> setBean(
            @ThriftField(value=1,name="arg0",requiredness=requiredness.NONE) final TestBean arg0
        );
    }
    @ThriftMethod(value = "getBean")
    TestBean getBean();


    @ThriftMethod(value = "setBean")
    void setBean(
        @ThriftField(value=1,requiredness=requiredness.NONE) final TestBean arg0
    );

}

生成的TestBean.java代码

package net.gdface.facelog.client;

import com.facebook.swift.codec.*;
import com.facebook.swift.codec.ThriftField.requiredness;
import java.util.*;

import static com.google.common.base.Objects.toStringHelper;

@ThriftStruct("TestBean")
public final class TestBean {
    public TestBean() {
    }

    private int id;

    @ThriftField(value=1,name="id",requiredness=requiredness.NONE)
    public int getId() { return id; }

    @ThriftField
    public void setId(final int id) { this.id = id; }

    @Override
    public String toString()
    {
        return toStringHelper(this)
            .add("id",id)
            .toString();
    }
}

thrift:swift 命令行生成 IDL文件及Client java代码过程的更多相关文章

  1. xcode – 如何通过LLDB命令行添加断点操作?

    如果你从Xcode编辑一个断点,有一个超级有用的选项,可以添加一个“Action”,以便在每次遇到断点时自动执行.如何从LLDB命令行添加此类操作?

  2. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  3. ios – 从Live Photo中提取视频部分

    有没有人想出如何从LivePhoto中提取视频部分?

  4. 在Sierra上,Brew安装错误单独使用Xcode是不够的

    我正在尝试使用HomeBrewv1.3.8在运行xCodev9.1的MacOSXSerrav10.12.6上安装软件包.安装和错误是然后我运行命令表示软件更新服务器无法使用命令行工具包.我进入xCode,它表明安装了命令行工具.任何帮助将非常感激.西奥解决方法我去了AppleDeveloper网站并直接下载了命令行工具dmg.首先需要设置Apple帐户.命令行工具可在以下位置找到–https://

  5. ios – 使用Swift的Lumberjack 2.0记录器

    我以前使用物镜C的Lumberjack记录器,我喜欢它.现在我开始学习Swift,我不能在那里使用我最喜欢的记录器.有人可以一步一步地写出我能做到的事吗?在Lumberjack2.0发布之前,我尝试在这里找到一些东西,但所有主题都是自定义包装器.我做了什么:>我用Cocoapods添加了Lumberjack;>我将“#import”添加到Bridging-Header文件中.我不知道接下来该怎么办?因为在ObjC中我有宏:staticconstintddLogLevel=LOG_LEVEL_INFO;el

  6. ios – 通过真实设备上的命令行进行UIAutomation

    提前谢谢解决方法您需要为其提供.ipa文件的路径.它实际上只需要应用程序名称,因此您只需传入应用程序名称即可.非常重要:应用程序需要安装在设备上,Instruments不会在设备上安装应用程序,它只会在设备上运行已安装的应用程序

  7. ios7 – Xcode 5命令行代码签名错误

    有没有人遇到过Xcode5(Build版本5A11344j)命令行工具无法在Xcode4.6.3(Build版本4H1503)中构建以前成功构建的项目的情况.错误消息如下:“检查依赖项代码签名错误:未找到代码签名标识:未找到与构建设置(“”)中指定的配置文件匹配的代码签名标识(即证书和私钥对).CodeSign错误:SDK“iOS7.0”中的产品类型“应用”需要代码签名“非常感谢任何见解.谢谢!解

  8. ios – 类型推断(自动类型检测)如何在swift中工作?

    LLVM如何检测变量是一个字符串?

  9. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

  10. ios – 覆盖Swift中的超类委托

    我正在开发一个包含两个UIViews的Swift(v1.2)项目.MyView和MyViewSubclass.MyView有一个委托,我想在MyViewSubclass中覆盖它作为一个子协议,类似于UITableViews有一个UITableViewDelegate,它也符合超级uiscrollviewdelegate.我的第一个想法是覆盖超类属性,但这会导致编译器错误,因为子类不能覆盖具有不同类

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部