前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring整合各种RPC框架(netty、dubbo、dubbox、gRPC、Motan、Tars)-续(Tars)

spring整合各种RPC框架(netty、dubbo、dubbox、gRPC、Motan、Tars)-续(Tars)

作者头像
逍遥壮士
发布2021-03-23 14:43:47
2K0
发布2021-03-23 14:43:47
举报
文章被收录于专栏:技术趋势

接上文:spring整合各种RPC框架(netty、dubbo、dubbox、gRPC、Motan)-续(Motan)


本文代码:https://gitee.com/hong99/spring/issues/I1N1DF


Tars是什么?

Tars是腾讯开源的一个高性能RPC开发框架,支持跨语言多平台。Tars是将腾讯内部使用的微服务架构TAF(Total Application Framework)多年的实践成果总结而成的开源项目。Tars这个名字来自《星际穿越》电影中机器人Tars, 电影中Tars有着非常友好的交互方式,任何初次接触它的人都可以轻松的和它进行交流,同时能在外太空、外星等复杂地形上,超预期的高效率的完成托付的所有任务。拥有着类似设计理念的Tars也是一个兼顾易用性、高性能、服务治理的框架,目的是让开发更简单,聚焦业务逻辑,让运营更高效,一切尽在掌握。

目前该框架在腾讯内部,有100多个业务、10多万台服务器上运行使用。

整体架构

架构拓扑

整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点。

服务节点:

服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机、云主机。随着服务的种类扩展和规模扩大,服务节点可能成千上万甚至数以十万计。每台服务节点上均有一个Node服务节点和N(N>=0)个业务服务节点,Node服务节点会对业务服务节点进行统一管理,提供启停、发布、监控等功能,同时接收业务服务节点上报过来的心跳。

公共框架节点:

除了服务节点以外的服务,其他服务节点均归为一类。

公共框架节点,数量不定,为了自身的容错容灾,一般也要求在在多个机房的多个服务器上进行部署,具体的节点数量,与服务节点的规模有关,比如,如果某些服务需要打较多的日志,就需要部署更多的日志服务节点。

又可细分为如下几个部分:

Web管理系统:在Web上可以看到服务运行的各种实时数据情况,以及对服务进行发布、启停、部署等操作;

Registry(路由+管理服务):提供服务节点的地址查询、发布、启停、管理等操作,以及对服务上报心跳的管理,通过它实现服务的注册与发现;

Patch(发布管理):提供服务的发布功能;

Config(配置中心):提供服务配置文件的统一管理功能;

Log(远程日志):提供服务打日志到远程的功能;

Stat(调用统计):统计业务服务上报的各种调用信息,比如总流量、平均耗时、超时率等,以便对服务出现异常时进行告警;

Property(业务属性):统计业务自定义上报的属性信息,比如内存使用大小、队列大小、cache命中率等,以便对服务出现异常时进行告警;

Notify(异常信息):统计业务上报的各种异常信息,比如服务状态变更信息、访问db失败信息等,以便对服务出现异常时进行告警;

原则上要求全部的节点之间网络互通,至少每台机器的node能够与公共框架节点之间都是可以连通的。

服务交互流程

框架服务在整个系统中运行时,服务之间的交互分:业务服务之间的交互、业务服务与框架基础服务之间的交互。

服务发布流程:在Web系统上传server的发布包到patch,上传成功后,在web上提交发布server请求,由registry服务传达到node,然后node拉取server的发布包到本地,拉起server服务。

管理命令流程:Web系统上的可以提交管理server服务命令请求,由registry服务传达到node服务,然后由node向server发送管理命令。

心跳上报流程:server服务运行后,会定期上报心跳到node,node然后把服务心跳信息上报到registry服务,由registry进行统一管理。

信息上报流程:server服务运行后,会定期上报统计信息到stat,打印远程日志到log,定期上报属性信息到property、上报异常信息到notify、从config拉取服务配置信息。

Client访问Server流程:client可以通过server的对象名Obj间接访问server,Client会从registry上拉取server的路由信息(如ip、port信息),然后根据具体的业务特性(同步或者异步,tcp或者udp方式)访问server(当然client也可以通过ip/port直接访问server)。

web管理系统

web管理系统主要包含以下功能:

业务管理:包括已部署的服务,以及服务管理、发布管理、服务配置、服务监控、特性监控等;

运维管理:包括服务部署、扩容、模版管理等;

服务结构

框架核心的服务端与客户端实现结构图如下:

服务端:

NetThread:收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;

BindAdapter:绑定端口类,用于管理Servant对应的绑定端口的信息操作;

ServantHandle:业务线程类,根据对象名分派Servant的对象和接口调用;

AdminServant:管理端口的对象;

ServantImp:继承Servant的业务处理基类(Servant:服务端接口对象的基类);

客户端:

NetThread:收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;

AdapterProxy:具体服务器某个节点的本地代理,管理到服务器的连接,以及请求超时处理;

ObjectProxy:远程对象代理,负责路由分发、负载均衡、容错,支持轮询/hash/权重;

ServantProxy:远程对象调用的本地代理,支持同步/异步/单向,Tars协议和非Tars协议;

AsyncThread:异步请求的回应包处理线程;

Callback:具体业务Callback的处理基类对象。

设计思想

Tars的设计思路是采用微服务的思想对服务进行治理,同时对整个系统的各个模块进行抽象分层,将各个层次之间相互解耦或者松耦合,如下图:

最底的协议层,设计思路是将业务网络通信的协议进行统一,以IDL(接口定义语言)的方式,开发支持多平台、可扩展、协议代码自动生成的统一协议。在开发过程中,开发人员只需要关注通讯的协议字段的内容,不需要关注其实现的细节,大大减轻了开发服务时需要考虑的协议是否能跨平台使用、是否可能需要兼容、扩展等问题。

中间的公共库、通讯框架、平台层,设计思路是让业务开发更加聚焦业务逻辑的本身。因此,从使用者的角度出发,封装了大量日常开发过程中经常使用的公共库代码和远程过程调用,让开发使用更简单方便;从框架本身的角度出发,做到高稳定性、高可用性、高性能,这样才能让业务服务运营更加放心;从分布式平台的角度出发,解决服务运营过程中,遇到的容错、负载均衡、容量管理、就近接入、灰度发布等问题,让平台更加强大。

最上面的运营层,设计思路是让运维只需要关注日常的服务部署、发布、配置、监控、调度管理等操作。

特性

tars协议

tars协议采用接口描述语言(Interface description language,缩写IDL)来实现,它是一种二进制、可扩展、代码自动生成、支持多平台的协议,使得在不同平台上运行的对象和用不同语言编写的程序可以用RPC远程调用的方式相互通信交流, 主要应用在后台服务之间的网络传输协议,以及对象的序列化和反序列化等方面。

协议支持的类型分两种,基本类型和复杂类型。

基本类型包括:void、bool、byte、short、int、long、float、double、string、unsigned byte、unsigned short、unsigned int;

复杂类型包括:enum、const、struct、vector、map,以及struct、vector、map的嵌套。

例如:

调用方式

通过IDL语言协议,可以定义服务提供的接口,并自动生成客户端和服务端的相关通信代码,服务端只需实现业务逻辑即可对外提供服务,客户端通过自动生成的代码即可调用服务,调用方式支持三种模式:

同步调用:客户端发出调用请求后等待服务返回结果后再继续逻辑;

异步调用:客户端发出调用请求后继续其他业务逻辑,服务端返回结果又由回调处理类处理结果;

单向调用:客户端发出调用请求后就结束调用,服务端不返回调用结果。

负载均衡

框架通过名字服务来实现服务的注册与发现,Client通过访问名字服务获取到被调服务的地址信息列表,Client再根据需要选择合适的负载均衡方式来调用服务,

负载均衡支持轮询、hash、权重等多种方式。

容错保护

容错保护通过两种方式实现:名字服务排除和Client主动屏蔽。

名字服务排除的策略:

业务服务主动上报心跳给名字服务,使名字服务知道服务部署的节点存活情况,当服务的某节点故障时,名字服务不在返回故障节点的地址给Client,达到排除故障节点的目标。名字服务排除故障需要通过服务心跳和Client地址列表拉取两个过程,故障排除时间在1分钟左右

Client主动屏蔽:

为了更及时的屏蔽故障节点,Client根据调用被调服务的异常情况来判断是否有故障来更快进行故障屏蔽。具体策略是,当client调用某个svr出现调用连续超时,或者调用的超时比率超过一定百分比,client会对此svr进行屏蔽,让流量分发到正常的节点上去。对屏蔽的svr节点,每隔一定时间进行重连,如果正常,则进行正常的流量分发。

过载保护

为了防止业务因为访问量突增或服务器故障造成系统整体的繁忙,进而导致全部服务的不可用,框架内部做相应设计来应对。实现请求队列,服务调用通过非阻塞方式实现异步系统,从而达到提升系统处理能力的目的。并且对队列的长度进行监控,当超过某个阀值,则拒绝新的请求。对请求设置超时时间,当请求包从队列里读取出来是判断请求是否超时,如果超时则不做处理。

消息染色

框架提供了对某服务某接口的特定请求进行染色的能力,染色的消息可以透传到后面需要访问的所有服务上,对染色的请求,服务自动把日志上报到特定的染色日志服务器上,使用者只需在染色服务器上即可分析请求访问的路径,方便跟踪定位问题。如下:

SET分组

为了方便对业务服务部署管理进行标准化和容量化,框架提供了Set部署能力,set之间没有调用关系,互不干扰,故障隔离,提高运维效率和服务可用性。

IDC分组

为了加快服务间的访问速度,减少跨地区、跨机房调用带来的网络资源消耗,减少网络故障带来的影响,框架提供了跨地区、跨机房,就近接入的功能。

集中配置

对业务配置进行集中管理并且操作web化,使配置修改更容易,通知更及时,配置变更也更安全;对配置变更进行历史记录,让配置可以轻松回退到前一版本。配置拉取服务化,服务只需调用配置服务的接口即可获取到配置文件。

为了能灵活管理配置文件,配置文件分为几个级别:应用配置、Set配置、服务配置和节点配置。

应用配置为最高一级的配置文件,它是多个服务配置提炼出来的公共配置,服务配置通过引用它来使用其配置内容。

Set配置是具体一个Set分组下所有服务的公共配置,在应用配置的基础上进行补充追加。

服务配置是具体一个服务下所有节点的公共配置,可以引用应用配置。

节点配置是一个应用节点的个性化配置,它和服务配置合并成为具体一个服务节点的配置。

数据监控

为了更好反映和监控小到服务进程、大到业务的运行质量情况,框架支持以下数据上报的功能:

提供了服务模块间调用信息统计上报的功能,方便用户查看服务的流量、延时、超时、异常等情况;

提供了用户自定义属性数据上报的功能,方便用户查看服务的某些维度或者指标,比如内存使用情况、队列大小、cache命中率等;

提供了服务状态变更和异常信息上报的功能,方便用户查看服务的何时发布过、重启过、宕过以及遇到的异常致命错误等;

参考文章:

https://doc.tarsyun.com/adminer/start/index.html#/tarsdoc/SUMMARY.md(建议这个,其他经常打不开!)

https://tarscloud.github.io/TarsDocs/

https://tarscloud.github.io/TarsDocs/base/tars-intro.html

https://tarscloud.org/

源码实现

Tars管理后台部署

环境部署TarsFramework

安装vscode(强烈建议)

注:刚开始我在windows黑窗口折腾几天都没成功,网上也没有找着相关解决方案,还有该框架比较少人用~,后面装了vscode发现在vscode的环境中运行直接就成功了,所以不需要瞎折腾了,用Visual Studio 2019 cmake方式构建.

切记:以下windows方式不通,仅做为过程展示,请参考docker方式!

依赖环境

软件

软件要求

windows版本:

win7以及以上

cmake版本:

3.2及以上版本(c++语言框架依赖)

mysql版本:

5.6及以上版本(框架运行依赖)

nvm版本:

0.35.1及以上版本

node版本:

12.13.0及以上版本

perl

安装地址:https://strawberryperl.com/

参考文章:https://github.com/TarsCloud/TarsDocs_en/blob/master/installation/source-windows.md

代码地址:

代码语言:javascript
复制
 git clone https://github.com/TarsCloud/TarsFramework.git --recursive

下载打开vs在终端打开如下操作:(注:下面这操作基本都是不成功的~)

代码语言:javascript
复制
cd TarsFramework
git submodule update --remote --recursive
cd build
cmake ..
cmake --build . --config RelWithDebInfo
cmake --build . --config RelWithDebInfo --target install

先下载cmake装好以后参考如下:

具体看下文 :

https://blog.csdn.net/weixin_39951988/article/details/88719634

接下下面的:

重新构建(注意:有问题千万要重新构建,折腾来折腾去后面是构建的原因...)

代码语言:javascript
复制
cmake --build .

注意喽,你生成的代码可能在原来的TarsFramework的deploy中或者在out/deploy把这块复制到 c盘下就OK了。切记(这里我折腾两天为啥没生成~)

代码语言:javascript
复制
cd c:\tars\cpp\deploy
git clone https://github.com/TarsCloud/TarsWeb.git web

进入c:\tars\cpp\deploy, 执行:

代码语言:javascript
复制
busybox.exe sh ./windows-install.sh MYSQL_HOST MYSQL_PASSWORD HOSTIP REBUILD(false[default]/true) SLAVE(false[default]/true) MYSQL_USER MYSQL_PORT
注意: busybox.exe是一个通用工具, 继承了大量linux工具
MYSQL_HOST: mysql数据库的ip地址
MYSQL_PASSWORD: mysql数据库的MYSQL_USER的密码(注意密码不要有太特殊的字符, 例如!, 否则shell脚本识别有问题, 因为是特殊字符)
HOSTIP: 本机IP, 注意不能是127.0.0.1
REBUILD: 是否重建数据库,通常为false, 如果中间装出错, 希望重置数据库, 可以设置为true
SLAVE: 是否是从节点
MYSQL_USER: mysql用户, 默认是root
MYSQL_PORT: mysql端口

运行如下:

代码语言:javascript
复制
.\busybox.exe sh ./windows-install.sh localhost 123456  10.3.6.59 false false root 3306

总算可以了~~~~无语了,部署这个基础我花了最少1个星期,这个tars如果新手同学建议用docker或其他方式部署吧千万不要用windows,坑得很,而且基本没有参考资料。网站也经常打不开,蛋疼~~~~~

最后再打开

下载地址:https://github.com/TarsCloud/TarsDocs.git

参考地址:https://tarscloud.github.io/TarsDocs/installation/web.html

下面是在搭基础脚手架遇到的一些问题~~~~当然好多坑就没记录了~

缺少了perl安装perl就可以了

启动时间有点久~注意下面的这个~ 把vs 生成的全部复制过来就OK了。

安装c++环境

根据你的系统cpu位数下载对应版本https://cmake.org/download/

详细安装:https://jingyan.baidu.com/article/6d704a1352dbb728db51ca8e.html

C++:https://cmake.org/download/

opencv:https://sourceforge.net/projects/opencvlibrary/files/latest/download

具体安装:https://blog.csdn.net/teavamc/article/details/78303231

以下这个问题折腾了两天~

解决方案

删除所有 ItemGroup 中包含 CustomBuild 的... 吐血~~~(这个方案不一定对~)

代码语言:javascript
复制
<ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-download.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Performing download step (download, verify and extract) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -P D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/tmp/ADD_libmysql-download.cmake
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-download
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-download-repoinfo.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Performing download step (download, verify and extract) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -P D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/tmp/ADD_libmysql-download.cmake
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-download
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-download-repoinfo.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Performing download step (download, verify and extract) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -P D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/tmp/ADD_libmysql-download.cmake
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-download
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-download-repoinfo.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Performing download step (download, verify and extract) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -P D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/tmp/ADD_libmysql-download.cmake
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-download
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-download-repoinfo.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-update.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generating src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Generating src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Generating src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-update
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-patch.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Skipping patch step (no custom command) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-patch
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Skipping patch step (no custom command) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-patch
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Skipping patch step (no custom command) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-patch
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Skipping patch step (no custom command) for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E echo_append
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-patch
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-configure.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Performing configure step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" . -DCMAKE_INSTALL_PREFIX=D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/mysql -DBUILD_CONFIG=mysql_release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-configure
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-cfgcmd.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Performing configure step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" . -DCMAKE_INSTALL_PREFIX=D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/mysql -DBUILD_CONFIG=mysql_release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-configure
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-cfgcmd.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Performing configure step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" . -DCMAKE_INSTALL_PREFIX=D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/mysql -DBUILD_CONFIG=mysql_release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-configure
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-cfgcmd.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Performing configure step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" . -DCMAKE_INSTALL_PREFIX=D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/mysql -DBUILD_CONFIG=mysql_release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-configure
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-cfgcmd.txt;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-build.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Performing build step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-build
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Performing build step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-build
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Performing build step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-build
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Performing build step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-build
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\22cd3191e27c683e91663337cb49a61a\ADD_libmysql-install.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Performing install step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release --target install
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-install
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Performing install step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release --target install
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-install
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Performing install step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release --target install
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-install
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Performing install step for 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
cd D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\mysql-lib
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" --build . --config release --target install
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-install
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\36f4b307e6a1134176f72fd2bac3f333\ADD_libmysql-complete.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Completed 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E make_directory D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)/ADD_libmysql-complete
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-done
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Completed 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E make_directory D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)/ADD_libmysql-complete
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-done
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Completed 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E make_directory D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)/ADD_libmysql-complete
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-done
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Completed 'ADD_libmysql'</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E make_directory D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/$(Configuration)/ADD_libmysql-complete
if %errorlevel% neq 0 goto :cmEnd
"C:\Program Files\CMake\bin\cmake.exe" -E touch D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/src/ADD_libmysql-stamp/$(Configuration)/ADD_libmysql-done
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-install;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-mkdir;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-download;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-update;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-patch;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-configure;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\src\ADD_libmysql-stamp\$(Configuration)\ADD_libmysql-build;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\f2a83bf0cb1c5019c0e3dcd4abf010c4\ADD_libmysql.rule">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"></Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\ADD_libmysql</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"></Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\ADD_libmysql</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'"></Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\ADD_libmysql</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'"></Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\$(Configuration)\ADD_libmysql-complete;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\ADD_libmysql</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>
  <ItemGroup>
    <CustomBuild Include="D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\CMakeLists.txt">
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Building Custom Rule D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/CMakeLists.txt</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -SD:/ideaWorkSpace/tars/TarsFramework/TarsFramework -BD:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build --check-stamp-file D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCXXInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCommonLanguageInclude.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeGenericSystem.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeInitializeConfigs.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeLanguageInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeRCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInitialize.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\CMakeCommonCompilerMacros.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\RepositoryInfo.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\cfgcmd.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\download.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\extractfile.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\mkdirs.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\WindowsPaths.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCXXCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeRCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeSystem.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_CURL-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_gtest-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\BuildTarsCpp.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Common.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\ParseAsm.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Thirdparty.cmake;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\generate.stamp</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Building Custom Rule D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/CMakeLists.txt</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -SD:/ideaWorkSpace/tars/TarsFramework/TarsFramework -BD:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build --check-stamp-file D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCXXInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCommonLanguageInclude.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeGenericSystem.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeInitializeConfigs.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeLanguageInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeRCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInitialize.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\CMakeCommonCompilerMacros.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\RepositoryInfo.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\cfgcmd.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\download.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\extractfile.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\mkdirs.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\WindowsPaths.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCXXCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeRCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeSystem.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_CURL-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_gtest-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\BuildTarsCpp.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Common.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\ParseAsm.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Thirdparty.cmake;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\generate.stamp</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">Building Custom Rule D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/CMakeLists.txt</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -SD:/ideaWorkSpace/tars/TarsFramework/TarsFramework -BD:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build --check-stamp-file D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCXXInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCommonLanguageInclude.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeGenericSystem.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeInitializeConfigs.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeLanguageInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeRCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInitialize.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\CMakeCommonCompilerMacros.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\RepositoryInfo.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\cfgcmd.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\download.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\extractfile.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\mkdirs.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\WindowsPaths.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCXXCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeRCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeSystem.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_CURL-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_gtest-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\BuildTarsCpp.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Common.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\ParseAsm.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Thirdparty.cmake;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\generate.stamp</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">false</LinkObjects>
      <Message Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">Building Custom Rule D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/CMakeLists.txt</Message>
      <Command Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">setlocal
"C:\Program Files\CMake\bin\cmake.exe" -SD:/ideaWorkSpace/tars/TarsFramework/TarsFramework -BD:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build --check-stamp-file D:/ideaWorkSpace/tars/TarsFramework/TarsFramework/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal &amp; call :cmErrorLevel %errorlevel% &amp; goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCXXInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeCommonLanguageInclude.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeGenericSystem.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeInitializeConfigs.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeLanguageInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeRCInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInformation.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\CMakeSystemSpecificInitialize.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\CMakeCommonCompilerMacros.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Compiler\MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\RepositoryInfo.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\cfgcmd.txt.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\download.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\extractfile.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\ExternalProject\mkdirs.cmake.in;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-C.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC-CXX.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows-MSVC.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\Windows.cmake;C:\Program Files\CMake\share\cmake-3.20\Modules\Platform\WindowsPaths.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeCXXCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeRCCompiler.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\3.20.0-rc1\CMakeSystem.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_CURL-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_gtest-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\tmp\ADD_libmysql-mkdirs.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\BuildTarsCpp.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Common.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\ParseAsm.cmake;D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\tarscpp\cmake\Thirdparty.cmake;%(AdditionalInputs)</AdditionalInputs>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">D:\ideaWorkSpace\tars\TarsFramework\TarsFramework\build\CMakeFiles\generate.stamp</Outputs>
      <LinkObjects Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">false</LinkObjects>
    </CustomBuild>
  </ItemGroup>

坑太多了~

本文代码:https://gitee.com/hong99/spring/issues/I1N1DF

java 实现 Tars

服务端

项目结构

代码语言:javascript
复制
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─hong
│ │ │ └─spring
│ │ │ └─server
│ │ │ └─testapp
│ │ └─resources
│ └─test
│ └─java
└─target
    ├─classes
    │ └─com
    │ └─hong
    │ └─spring
    │ └─server
    │ └─testapp
    ├─generated-sources
    │ └─annotations
    ├─maven-archiver
    └─maven-status
        └─maven-compiler-plugin
            ├─compile
            │ └─default-compile
            └─testCompile
                └─default-testCompile

参考:https://doc.tarsyun.com/adminer/start/index.html#/tarsdoc/hello-world/tarsjava.md

在resource中添加该hello.tars

hello.tars

代码语言:javascript
复制
module TestApp
{
   interface Hello
   {
       string hello(int no, string name);
   };
};

spring_rpc/spring_tars_server/pom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring_rpc</artifactId>
        <groupId>com.hong</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hong.spring</groupId>
    <artifactId>tarsjavaserver</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.tencent.tars</groupId>
            <artifactId>tars-server</artifactId>
            <version>1.6.1</version>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>com.tencent.tars</groupId>
            <artifactId>tars-spring</artifactId>
            <version>1.7.2</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.tencent.tars</groupId>
                <artifactId>tars-maven-plugin</artifactId>
                <version>1.6.1</version>
                <configuration>
                    <tars2JavaConfig>
                        <!-- tars文件位置 -->
                        <tarsFiles>
                            <tarsFile>${basedir}/src/main/resources/hello.tars</tarsFile>
                        </tarsFiles>
                        <!-- 源文件编码 -->
                        <tarsFileCharset>UTF-8</tarsFileCharset>
                        <!-- 生成服务端代码 -->
                        <servant>true</servant>
                        <!-- 生成源代码编码 -->
                        <charset>UTF-8</charset>
                        <!-- 生成的源代码目录 -->
                        <srcPath>${basedir}/src/main/java</srcPath>
                        <!-- 生成源代码包前缀 -->
                        <packagePrefixName>com.hong.spring.server.</packagePrefixName>
                    </tars2JavaConfig>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
        <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
        </plugins>
    </build>

</project>

通过maven生成tars

生成了两个文件如下:

在resource下再配置servants.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<servants>
    <servant name="HelloObj">
        <home-api>com.hong.spring.server.testapp.HelloServant</home-api>
        <home-class>com.hong.spring.server.testapp.HelloServantImpl</home-class>
    </servant>
</servants>

然后通过maven生成包如下:mvn package或如下操作

配置web 管理后台

进入运维管理配置如下:

部署完发现 一直无法用,windows上面的坑太多了,还是改为docker部署~

接下基于windows的docker

安装参考:

https://blog.csdn.net/lupengfei1009/article/details/94637398

主节点部署命令:

代码语言:javascript
复制
docker run -d -p 3001:3001  -p 3000:3000 -e MYSQL_HOST="10.3.6.59"   -e MYSQL_ROOT_PASSWORD="123456"   -e MYSQL_USER=root -e MYSQL_PORT=3306   -e REBUILD=false  -e SLAVE=false tarscloud/framework:v2.4.0 tars

子节点部署命令:

代码语言:javascript
复制
docker run -d -p 9000-9010:9000-9010  -e WEB_HOST="http://172.25.0.3:3000" --ip="172.17.0.5"  -v /data/node:/data/app -v /etc/localtime:/etc/localtime tarscloud/tars-node:latest

上面的部署切记: 部署是部署在子节点上面,不要部署在主节点上面,这里我也折腾好久。

配置纯java部署节点

然后打maven的war包,注意是war包,还有切记把以下加到maven的plugins中

代码语言:javascript
复制
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.0.0</version>
</plugin>

进入目录打包 注意要配好windows的maven环境

mvn package

结果如下:

然后上传

账号:admin 密码:csh 注意我改过

先检查节点是否通

切记这两个状态,必须都是Active才算是正常。

测试

服务管理->接口调试->添加

注意以上:如果非docker部署,我在上面折腾了近一个星期发现部署问题导致无法上传...

调试

docker遇到过的问题:

网络不通:

用户端

结构

代码语言:javascript
复制
pom.xml
│ tree.txt
│
└─src
    ├─main
    │ ├─java
    │ │ └─com
    │ │ └─hong
    │ │ │ App.java
    │ │ │ Main.java
    │ │ │
    │ │ └─java
    │ │ └─client
    │ │ └─testapp
    │ │ HelloPrx.java
    │ │ HelloPrxCallback.java
    │ │
    │ └─resources
    │ client.tars
    │ hello.tars
    │
    └─test
        └─java

resources\hello.tars

代码语言:javascript
复制
module TestApp
{
   interface Hello
   {
       string hello(int no, string name);
   };
};

resources\client.tars

代码语言:javascript
复制
module TestApp
{
   interface Client
   {
       string rpcHello(int no, string name);
   };
};

spring_rpc/java_tars_client/pom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring_rpc</artifactId>
        <groupId>com.hong</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>java_tars_client</artifactId>

    <properties>
        <log4j-slf4j-impl>1.7.25</log4j-slf4j-impl>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <artifactId>spring_rpc</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>log4j-slf4j-impl</artifactId>
                    <groupId>org.apache.logging.log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>*</artifactId>
                    <groupId>*</groupId>
                </exclusion>
            </exclusions>
            <groupId>com.hong</groupId>
            <version>1.0-SNAPSHOT</version>

        </dependency>
        <dependency>
            <groupId>com.tencent.tars</groupId>
            <artifactId>tars-client</artifactId>
            <version>1.7.2</version>
            <type>jar</type>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.tencent.tars</groupId>
                <artifactId>tars-maven-plugin</artifactId>
                <version>1.6.1</version>
                <configuration>
                    <tars2JavaConfig>
                        <!-- tars文件位置 -->
                        <tarsFiles>
                            <tarsFile>${basedir}/src/main/resources/hello.tars</tarsFile>
                        </tarsFiles>
                        <!-- 源文件编码 -->
                        <tarsFileCharset>UTF-8</tarsFileCharset>
                        <!-- 生成代码,PS:客户端调用,这里需要设置为false -->
                        <servant>false</servant>
                        <!-- 生成源代码编码 -->
                        <charset>UTF-8</charset>
                        <!-- 生成的源代码目录 -->
                        <srcPath>${basedir}/src/main/java</srcPath>
                        <!-- 生成源代码包前缀 -->
                        <packagePrefixName>com.hong.java.client.</packagePrefixName>
                    </tars2JavaConfig>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

然后生成代码:

com.hong.Main

代码语言:javascript
复制
package com.hong;

import com.hong.java.client.testapp.HelloPrx;
import com.hong.java.client.testapp.HelloPrxCallback;
import com.qq.tars.client.Communicator;
import com.qq.tars.client.CommunicatorConfig;
import com.qq.tars.client.CommunicatorFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;
/**
 *
 * 功能描述: 测试可用
 *
 * @param:
 * @return:
 * @auther: csh
 * @date: 2021/3/5 17:34
 */
public class Main {

    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) throws InterruptedException {
        // Start configuration locally
        CommunicatorConfig cfg = new CommunicatorConfig();
        // Start communicator locally
        Communicator communicator = CommunicatorFactory.getInstance().getCommunicator(cfg);
        //warn If the deployment is started on the tars, you can only use the following constructor to get the communicator
        //Communicator communicator = CommunicatorFactory.getInstance().getCommunicator();
        //todo 注意这里的9002是你的服务端口
        //todo tarsjavaserver.javaserver.HelloObj 是你的服务的
        HelloPrx proxy = communicator.stringToProxy(HelloPrx.class, "tarsjavaserver.javaserver.HelloObj@tcp -h 127.0.0.1 -p 9002 -t 60000");

        //Synchronous call
        String ret = proxy.hello(1000, "Hello i'm hong!");
        System.out.println(ret);

        //One-way call
        proxy.async_hello(null, 1000, "Hello this is tars world! ");

        //Asynchronous call
        proxy.async_hello(new HelloPrxCallback() {

            @Override
            public void callback_expired() {
            }

            @Override
            public void callback_exception(Throwable ex) {
            }

            @Override
            public void callback_hello(String ret) {
                Main.logger.info("invoke use async {}", ret);

            }
        }, 1000, "Hello World2");

        proxy.promise_hello(1000, "hello world3").thenCompose(x -> {
            logger.info("invoke use promise {}", x);
            return CompletableFuture.completedFuture(0);
        });

        Thread.sleep(1000l);
    }
}

结果:

说真的很费劲,结果在服务端我也没查到具体日志!!!

由于每次写的文章太长,好多老铁建议拆开,所以tars基于springmvc及springboot下文再发。

最后

不得不说tars是一个非常优秀的rpc框架,支持跨语言跨服务,但也不得不说学习成本非常高,特别部署方面,真的花了最少2周以上的时间,如果真的用上的话维护成本就更不用说了,当然tars团队算是比较nice的了,在线提供解答,这也有利于学习tars的同学,快速上手。不过最后强调tars如果真的想了解学习还是基于docker部署吧,如果是纯windows或centos一堆未知问题,如果有耐心建议可以尝试,如果不想在这个框架上面浪费几周甚至更长时间建议docker就OK了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文代码:https://gitee.com/hong99/spring/issues/I1N1DF
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档