-
Eclipse中使用SVN
2014-03-29 20:31:12概述在我们的日常工作中,经常会用到SVN,大多数都是搭配Eclipse/MyEclipse使用。本文主要介绍SVN在Eclipse中的一些最长用的功能,包括SVN插件的下载使用、上传代码到服务器、从服务器下载代码、从服务器更新代码、...推荐阅读
概述
在我们的日常工作中,经常会用到SVN,大多数都是搭配Eclipse/MyEclipse使用。本文主要介绍SVN在Eclipse中的一些最长用的功能,包括SVN插件的下载使用、上传代码到服务器、从服务器下载代码、从服务器更新代码、解决代码冲突。
本文链接:http://blog.csdn.net/v123411739/article/details/22512133
1.在Eclipse里下载Subclipse插件(建议使用方法三)
方法一:从Eclipse Marketplace里面下载
具体操作:打开Eclipse --> Help --> Eclipse Marketplace --> 在Find中输入subclipse搜索 --> 找到subclipse点击install方法二:从Install New Software里下载
具体操作:打开Eclipse --> Help --> Install New Software --> 点击add按钮,输入下载地址:http://subclipse.tigris.org/update_1.10.x,点击OK--> 将Subclipse和SVNKit打勾后,一路next或agree到结束即可(此处由于本人已经安装,因此next是灰色的)方法三:直接下载subclipse的zip文件(建议使用)
具体操作:百度搜索subclipse-site-1.10.x(看自己想安装哪个版本) --> 解压缩后在eclipse目录下找到dropins文件夹,进入dropins文件夹并新建一个文件夹名为svn,将features和plugins文件夹复制到svn目录下-->重启下Eclipse即可2.上传project到SVN服务器
1.在Eclipse中,从Show View里调出SVN资源库视图
2.在SVN资源库窗口的空白位置右键选择新建资源库位置
3.填好服务器的地址
4.资源库导入成功,SVN资源库视图下出现导入的资源库
5.新建project,写好project的初始版本
6.右键Project --> Team --> Share Project
7.选择Repository类型为SVN --> 点击next
8.使用已有资源库位置,或者创建新的资源库位置
9.使用项目名称作为文件夹名 --> 点击Finish --> 输入用户名和密码(此步不一定每个人都有)
10.自由选择是否打开Synchronize视图,建议打开
11.右键project --> Team --> 提交
12.自由选择是否写日志(建议写)
13.点击OK --> 上传到服务器成功,此时刷新对应的资源库,资源库下出现上传的Project
3.从服务器下载project到本地
1.在资源库视图点击资源库左边的小三角形后出现该资源库下的所有Project(如果还没有资源库则参考上面新建一个资源库位,填入资源库地址即可)
2.选择要下载的project右键 --> 检出为
3.自由选择是否更改属性(建议使用默认) --> Finish --> 下载成功
4.从服务器更新代码
1.右键项目Project --> 与资源库同步2.选择打开Synchronize视图3.与本地代码有不同的服务器代码将显示在Synchronize视图下,双击某个代码文件可以查看本地代码和服务器代码的对比,加号的为新增的文件(本地还没有)4.将模式切换到Incoming Mode,这个模式下的代码都是服务器更新的代码,需要下载到本地的,右键要更新的文件 --> Team --> 更新5.如果出现下图这个符号,则代表本地代码和服务器代码有冲突(即:本地代码在未更新到最新版本的情况下,对代码进行了更改;或者在你对a.java写代码的期间,有人往服务器上传了新的a.java代码,使得代码间出现了冲突),有冲突时需要先解决冲突再合并代码
5.冲突情况的解决办法
冲突情况1:服务器代码和自己代码改动的地方相同
这种情况比较复杂,一般只能将自己的代码保存一份到本地,然后直接将服务器代码更新下来,然后在新的代码上修改自己的逻辑。冲突情况2:服务器代码和自己代码改动的地方不同
这种情况比较常见,就是你跟别的开发者都在更改同一个文件,但是由于开发任务是分开的,所以更改的地方是不同的,解决办法如下。1、双击冲突文件进入比较视图2、找到服务器上新增的但本地没有的代码块,选中此代码块,点击右上角的按钮(如下图箭头指向的按钮)将服务器代码复制到本地(其他地方也同此操作),如果点击按钮没用,则关闭比较视图重新打开
下图为成功将服务器代码复制到本地代码,
3.将所有服务器上新增的代码复制到本地文件后,右键冲突文件选择标记为合并即可,此时该文件就会消失在Synchronize视图下,并且该文件的代码已经成功将本地代码和远程代码合并到一起
-
Java集合Stream类filter的使用
2018-05-11 11:49:42之前的Java集合中removeIf的使用一文写了使用removeIf来实现按条件对集合进行过滤。这篇文章使用同样是JDK1.8新加入的Stream中filter方法来实现同样的效果。之前的Java集合中removeIf的使用一文写了使用
removeIf
来实现按条件对集合进行过滤。这篇文章使用同样是JDK1.8新加入的Stream
中filter
方法来实现同样的效果。并且在实际项目中通常使用filter
更多。关于Stream
的详细介绍参见Java 8系列之Stream的基本语法详解。
同样的场景:你是公司某个岗位的HR,收到了大量的简历,为了节约时间,现需按照一点规则过滤一下这些简历。比如要经常熬夜加班,所以只招收男性。//求职者的实体类 public class Person { private String name;//姓名 private Integer age;//年龄 private String gender;//性别 ... //省略构造方法和getter、setter方法 ... //重写toString,方便观看结果 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
这里就不展示使用传统
Iterator
来进行过滤了,有需要做对比的可以参见之前的Java集合中removeIf的使用。
使用Stream
的filter
进行过滤,只保留男性的操作:Collection<Person> collection = new ArrayList(); collection.add(new Person("张三", 22, "男")); collection.add(new Person("李四", 19, "女")); collection.add(new Person("王五", 34, "男")); collection.add(new Person("赵六", 30, "男")); collection.add(new Person("田七", 25, "女")); Stream<Person> personStream = collection.stream().filter(new Predicate<Person>() { @Override public boolean test(Person person) { return "男".equals(person.getGender());//只保留男性 } }); collection = personStream.collect(Collectors.toList());//将Stream转化为List System.out.println(collection.toString());//查看结果
运行结果如下:
[Person{name=‘张三’, age=22, gender=‘男’}, Person{name=‘王五’, age=34, gender=‘男’}, Person{name=‘赵六’, age=30, gender=‘男’}]
Process finished with exit code 0上面的demo没有使用
lambda
表达式,下面的demo使用lambda
来进一步精简代码:Collection<Person> collection = new ArrayList(); collection.add(new Person("张三", 22, "男")); collection.add(new Person("李四", 19, "女")); collection.add(new Person("王五", 34, "男")); collection.add(new Person("赵六", 30, "男")); collection.add(new Person("田七", 25, "女")); Stream<Person> personStream = collection.stream().filter( person -> "男".equals(person.getGender())//只保留男性 ); collection = personStream.collect(Collectors.toList());//将Stream转化为List System.out.println(collection.toString());//查看结果
效果和不用
lambda
是一样的。不过读者在使用
filter
时不要和removeIf
弄混淆了:removeIf
中的test
方法返回true
代表当前元素会被过滤掉;filter
中的test
方法返回true
代表当前元素会保留下来。
-
新来个技术总监,禁止我们使用Lombok!
2020-02-11 10:42:02我有个学弟,在一家小型互联网公司做Java后端开发,最近他们公司新来了一个技术总监,这位技术总监对技术细节很看重,一来公司之后就推出了很多"政策",比如定义了很多开发规范、日志规范、甚至是要求大家统一使用某...CSDN博客之星,期待你的投票,谢谢!
CSDN博客之星,期待你的投票,谢谢!
CSDN博客之星,期待你的投票,谢谢!我有个学弟,在一家小型互联网公司做Java后端开发,最近他们公司新来了一个技术总监,这位技术总监对技术细节很看重,一来公司之后就推出了很多"政策",比如定义了很多开发规范、日志规范、甚至是要求大家统一使用某一款IDE。
但是这些都不是我这个学弟和我吐槽的点,他真正和我吐槽的是,他很不能理解,这位新来的技术总监竟然禁止公司内部所有开发使用Lombok。但是又没给出十分明确的,可以让人信服的理由。
于是他来找我聊天,问我这个要求到底是否合理。关于这个事情,我认为这位技术总监的出发点是好的,但是做法未免有些极端。
之所以说出发点是好的,是因为使用Lombok确实会带来很多问题,而且我个人在工作中也基本不主动使用。
之所以说不主动使用,那是因为有些同事的代码还是使用了的,所以我也被迫的要安装Lombok的插件。
既然聊到这个话题,就简单说说我的一些看法。
Lombok有什么好处?
Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。
如果大家对于Lombok比较了解的话,可以先跳过这一段,直接往后看,如果不是很熟悉的话,可以简单了解一下。
想在项目中使用Lombok,需要三个步骤:
一、IDE中安装Lombok插件
目前Lombok支持多种IDE,其中包括主流的Eclips、Intellji IDEA、Myeclipse等都是支持的。
在IDEA中安装方式如下:

二、导入相关依赖
Lombok 支持使用多重构建工具进行导入依赖,目前主要支持maven、gardle、ant等均支持。
如使用maven导入方式如下:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency>
三、代码中使用注解
Lombok精简代码的方式主要是通过注解来实现,其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。
如使用@Data注解,即可简单的定义一个Java Bean:
import lombok.Data; @Data public class Menu { private String shopId; private String skuMenuId; private String skuName; }
使用@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用。
即自动帮忙给例子中的Menu类中定义了toString、Getter、Setter等方法。
通过上面的例子,大家可以发现,我们是使用@Data注解大大减少了代码量,使代码非常简洁。这也是很多开发者热衷于使用Lombok的主要原因。
另外,关于Lombok的使用,不同人有不同的看法,因为很多人都使用过Lombok,对于他的优点都比较了解,所以接下来我们重点说一下Lombok的使用会带来哪些问题。
Lombok有什么坏处?
强X队友
因为Lombok的使用要求开发者一定要在IDE中安装对应的插件。
如果未安装插件的话,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。
也就是说,如果项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件。否则就没办法协同开发。
更重要的是,如果我们定义的一个jar包中使用了Lombok,那么就要求所有依赖这个jar包的所有应用都必须安装插件,这种侵入性是很高的。
代码可读性,可调试性低
在代码中使用了Lombok,确实可以帮忙减少很多代码,因为Lombok会帮忙自动生成很多代码。
但是这些代码是要在编译阶段才会生成的,所以在开发的过程中,其实很多代码其实是缺失的。
在代码中大量使用Lombok,就导致代码的可读性会低很多,而且也会给代码调试带来一定的问题。
比如,我们想要知道某个类中的某个属性的getter方法都被哪些类引用的话,就没那么简单了。
有坑
因为Lombok使代码开发非常简便,这就使得部分开发者对其产生过度依赖。
在使用Lombok过程中,如果对于各种注解的底层原理不理解的话,很容易产生意想不到的结果。
举一个简单的例子,我们知道,当我们使用@Data定义一个类的时候,会自动帮我们生成equals()方法 。
但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认是@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。
这就可能得到意想不到的结果。
影响升级
因为Lombok对于代码有很强的侵入性,就可能带来一个比较大的问题,那就是会影响我们对JDK的升级。
按照如今JDK的升级频率,每半年都会推出一个新的版本,但是Lombok作为一个第三方工具,并且是由开源团队维护的,那么他的迭代速度是无法保证的。
所以,如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。
还有一个可能带来的问题,就是Lombok自身的升级也会受到限制。
因为一个应用可能依赖了多个jar包,而每个jar包可能又要依赖不同版本的Lombok,这就导致在应用中需要做版本仲裁,而我们知道,jar包版本仲裁是没那么容易的,而且发生问题的概率也很高。
破坏封装性
以上几个问题,我认为都是有办法可以避免的。但是有些人排斥使用Lombok还有一个重要的原因,那就是他会破坏封装性。
众所周知,Java的三大特性包括封装性、继承性和多态性。
如果我们在代码中直接使用Lombok,那么他会自动帮我们生成getter、setter 等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。
举个简单的例子,我们定义一个购物车类:
@Data public class ShoppingCart { //商品数目 private int itemsCount; //总价格 private double totalPrice; //商品明细 private List items = new ArrayList<>(); } //例子来源于《极客时间-设计模式之美》
我们知道,购物车中商品数目、商品明细以及总价格三者之前其实是有关联关系的,如果需要修改的话是要一起修改的。
但是,我们使用了Lombok的@Data注解,对于itemsCount 和 totalPrice这两个属性。虽然我们将它们定义成 private 类型,但是提供了 public 的 getter、setter 方法。
外部可以通过 setter 方法随意地修改这两个属性的值。我们可以随意调用 setter 方法,来重新设置 itemsCount、totalPrice 属性的值,这也会导致其跟 items 属性的值不一致。
而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的 setter 方法,明显违反了面向对象的封装特性。
好的做法应该是不提供getter/setter,而是只提供一个public的addItem方法,同时取修改itemsCount、totalPrice以及items三个属性。
总结
本文总结了常用的Java开发工具Lombok的优缺点。
优点是使用注解即可帮忙自动生成代码,大大减少了代码量,使代码非常简洁。
但是并不意味着Lombok的使用没有任何问题,在使用Lombok的过程中,还可能存在对队友不友好、对代码不友好、对调试不友好、对升级不友好等问题。
最重要的是,使用Lombok还会导致破坏封装性的问题。
虽然使用Lombok存在着很多方便,但是也带来了一些问题。
但是到底建不建议在日常开发中使用,我其实保持一个中立的态度,不建议大家过度依赖,也不要求大家一定要彻底不用。
只要大家在使用的过程中,或者评估要不要在代码中引入Lombok之前,在想到他的优点的同时,能够考虑到他给代码带来的问题的,那么本文的目的也就达到了!
参考资料:
https://time.geekbang.org/column/article/164907
https://projectlombok.org/
-
CodeBlocks的安装及使用
2017-10-02 18:42:27CodeBlocks的安装及使用...二、进入下载页面三、一般使用的话选择安装二进制版就可以四、选择合适的版本,这里我下载的是适用于windows的带编译器等工具的版本,也是大家最常用的版本五、这里我选择的是Sourceforge.neCodeBlocks的安装及使用
下载并安装CodeBlocks
一、在百度等搜索引擎搜索codeblocks或直接输入网址http://www.codeblocks.org/进入CodeBlocks官网
二、进入下载页面
三、一般使用的话选择安装二进制版就可以
四、选择合适的版本,这里我下载的是适用于windows的带编译器等工具的版本,也是大家最常用的版本
注:带mingw的为带编译器的版本,建议大家下这个,安装完成就可直接使用(例如codeblocks-20.03mingw-setup.exe)五、这里我选择的是Sourceforge.net
如果速度可以的话直接点击direct link下载即可,或者点击mirror,手动选择更合适的mirror
六、下载完成后启动安装程序
根据需要选择是否立即运行完成安装
CodeBlocks的使用
一、首次使用会有以下界面
使用默认的编译器
根据需要选择关联文件二、创建第一个C/C++程序
1、创建一个工程
方法一:
方法二:
2、选择控制台应用程序
也可按F9快捷键实现编译并运行Hello world!
-
Swagger 常用注解使用详解
2018-03-16 09:18:24刚开始的时候,在controller层使用@RequestParam的时候,发现这个参数是必须要输入值的,但是我们有时候必须查询的时候允许参数为空,使用这个注解就不行了。在集成了swagger2后,找了半天的原因,发现使用@... -
docker-compose教程(安装,使用, 快速入门)
2017-12-03 22:31:45教程基于ubuntu下最新的compose版本3 ... 1.Compose介绍 Docker Compose是一个用来定义和运行复杂应用的Docker工具。...使用Docker Compose不再需要使用shell脚本来启动容器。 Compose 通过一个配... -
IntelliJ IDEA使用教程 (总目录篇)
2017-08-21 14:12:52IntelliJ IDEA使用教程 (总目录篇) -
Oracle序列创建和使用
2018-01-12 00:10:58Oracle序列创建和使用 创建序列 语法 CREATE SEQUENCE 序列名 [相关参数] 参数说明 INCREMENT BY :序列变化的步进,负值表示递减。(默认1) START WITH:序列的初始值 。(默认1) MAXvalue:序列可生成的最大值。... -
Pycharm简单使用教程
2018-03-02 11:19:51所以我们推荐第一次运行使用右键的方式,将脚本切换之后再使用绿三角。 到此,建立项目,运行脚本文件的流程都介绍完毕了 4、pycharm使用前的一些简单设置 模板 为了便于不用每次都输入 #!/usr/bin/env... -
IntelliJ IDEA 最佳使用方式
2018-10-05 10:23:06文本信息从这里拷贝获取: 戳这里可以查看更多工具的使用还可以复制文本信息 地址: https://github.com/Byron4j/licensekey_activecode/tree/master https://github.com/Byron4j/licensekey_activecode/tree/master -
colorUI框架使用教程
2019-03-10 16:43:30最近在帮别人做一个小程序,问起熟悉小程序的同伴们用什么UI框架比较好,在网上也又搜了一遍,感觉这个突然出现的ColorUI很有意思,也很精美,于是乎就试了一下,这里说一下自己初次使用所遇到的坑与感想: ... -
C/C++ 开发神器 CLion 使用入门
2018-10-23 14:18:19同样支持python哦,相信使用过IntelliJ idea开发过java的盆友都很清楚该IDE的强大,所以做为Jetbrains旗下的c/c++开发工具CLion同样包含了许多智能功能来提高开发人员的生产力,提高开发人员... -
pdf.js使用方法
2018-06-08 14:46:32项目中 显示 pdf 的功能,浏览过不少的技术帖,都不太理想,花了点时间研究了下pdf.js正确使用方法,总结下:1.防止自己忘记 2.工作留有痕迹 3.供大家参考借鉴 pdf.js: 将 PDF 文件解析后生成一张 .png 图片,利用 ... -
eclipse使用maven教程
2017-12-27 20:41:36eclipse使用maven教程eclipse使用maven教程 什么是maven maven下载与安装与配置 1下载 2安装 3配置环境变量 在eclipse中配置 1 m2eclipse安装 2配置eclipse 3创建一个maven项目 1项目的结构 2Eclipse中maven常用的命... -
visual studio新手使用教程
2018-09-18 12:37:39目录 1.下载安装Visual Studio 2.新建工程 ...对于刚刚接触编程的新手来说,最先需要熟练掌握的当然是语言之祖——C语言,而C语言编译器首当其冲的必然是visual studio ,小编入门使用VC6.0,... -
Nacos做服务注册中心使用案例
2020-09-21 04:27:51关于环境搭建部分请借鉴:nacos做配置中心和服务注册中心 的完整使用案例 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-... -
Gradle的使用教程
2018-08-08 19:28:28Gradle是一个好用的构建工具 ,使用它的原因是: 配置相关依赖代码量少,不会像maven一样xml过多 打包编译测试发布都有,而且使用起来方便 利用自定义的任务可以完成自己想要的功能 二、安装 下载地址... -
使用anaconda安装pytorch
2019-07-09 15:14:33使用anaconda安装pytorch使用anaconda安装pytorch过程中出现的问题使用anaconda直接从网上下载使用anaconda从本地下载torch使用anaconda从本地下载torchvision 使用anaconda安装pytorch过程中出现的问题 在使用... -
JdbcTemplate基本使用
2019-03-13 18:25:35JdbcTemplate基本使用 目标 能够掌握JdbcTemplate+Druid创建数据库 讲解 JdbcTemplate介绍 JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,... -
使用maven创建web项目
2014-07-18 09:36:08目前做的项目使用的是MAVEN来管理jar包,这也是我第一次接触maven,感觉非常好,再也不用一个一个去添加和下载jar包了,直接在maven配置文件中配置就可以了,maven可以帮助我们自动下载。非常方便。之前比较忙没时间... -
pip install 使用国内镜像
2019-01-15 22:13:36让PIP源使用国内镜像,提升下载速度和安装成功率。 对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像,... -
idea快速开发之代码模板的使用方法
2020-05-04 22:01:06学习时,使用IDEA编写Java的时候,经常使用到不少代码模板,熟悉代码模板可以提高编码效率。以下介绍开发时经常使用到的代码模板。 idea代码模板使用教程目录一、 常用代码模板1.1 使用代码模板1.2 常见的代码模板二... -
Hive中rlike,like,not like,regexp区别与使用详解
2018-03-05 22:56:481.like的使用详解 1.语法规则: 格式是A like B,其中A是字符串,B是表达式,表示能否用B去完全匹配A的内容,换句话说能否用B这个表达式去表示A的全部内容,注意这个和rlike是有区别的。返回的结果是True/False. B... -
oracle的 listagg() WITHIN GROUP () 行转列函数的使用
2018-07-11 18:12:251.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = '20' ; 效果: 2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较... -
Java中Math函数的使用
2018-04-08 11:49:40Java中Math函数的使用 说到Java中的Math函数,大家肯定不陌生,但是在真正使用的时候却犯了难,那么多方法,我们到底需要使用哪个呢? 为此,我特地研究了一些Math常用函数的使用,以方便大家使用。 算术计算 ... -
【工具使用】idea如何开启Run DashBoard
2018-09-15 15:57:00小编最近在配置spring boot项目时,发现2018版本的idea项目启动中,会弹出一个窗口Run Dashboard,每次都要点击一下,才能正常使用,那么如何设置Run Dashboard自动使用呢? -
SecureCRT的使用教程( 过程非常详细!!值得查看)
2020-03-06 16:03:51SecureCRT的使用教程( 过程非常详细!!值得查看)下载和安装简单的介绍一、SecureCRT的使用二、SecureFX的使用 下载和安装 SecureCRT和SecureFX的下载和安装我这里就不多说了,详细的安装下载教程请参考:... -
SpringBoot使用Nacos配置中心
2019-01-26 18:27:59本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心。 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计。它可以帮助您轻松构建云本机应用程序和微服务平台。 ... -
Java 代码优化:使用构造函数和使用一个个setter的效率差别
2019-06-18 10:13:06在对Java代码进行优化的时候,想方设法的要提高整体的效率,使用JProfiler看代码的时间占比,然后,看看哪些部分是可以优化的,减少运行时间的。下面有这么几个方向。 ... 1,能使用构造函数一步到位的,就尽量使用... -
xshell 5评估期已过,不能使用的解决办法
2018-01-19 14:46:02正在使用的xshell 5不能使用,提示xshell 5评估期已过,重新安装还是不行。其实xshell 5有免费版的,即Home & school 版本。卸载原程序,下载安装免费版本的xshell 5即可。免费版本的链接:...