• OBS_JAVA_SDK 示例工程无法添加
    帮助中心 > OBS_JAVA_SDK > 开发指南 > 相关资源 > 示例工程 huawei-obs-java-sdk-demo.zip 无法添加的啊?
  • 华为云API介绍(五)华为云Java SDK -VPC操作示例
    本帖最后由 Mercy 于 2018-3-27 10:33 编辑[code]import java.util.List; import java.util.stream.Collectors; import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import com.huawei.openstack4j.api.Builders; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.api.types.ServiceType; import com.huawei.openstack4j.core.transport.Config; import com.huawei.openstack4j.model.common.ActionResponse; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.openstack.OSFactory; import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver; import com.huawei.openstack4j.model.compute.Action; import com.huawei.openstack4j.model.compute.RebootType; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.model.compute.Server.Status; import com.huawei.openstack4j.model.compute.ServerCreate; import com.huawei.openstack4j.model.network.AttachInte**ceType; import com.huawei.openstack4j.model.network.Network; import com.huawei.openstack4j.model.network.Subnet; import com.huawei.openstack4j.model.network.Router; import com.huawei.openstack4j.model.network.RouterInte**ce; public class Demo_for_VPC { private static final String LANGUAGE = "zh-cn"; public static void main(String[] args) { // 第一步:填入华为云区域的endpoint,如下,对接华北区1就需要填入华北区服务的endpoint OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhuaweicloud.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com"); /* 第二步: 配置鉴权信息(以对接华北区为例) * user为用户名 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID * authURL为IAM服务华北区的域名 */ String user = "wanglianmin-guest"; String password = "XXXXXX"; String projectId = "74610f3a5ad941998e91f076297ecf27"; String userDomainId = "2aa29cbca17a4822abd096610e378ffa"; String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3"; // 第三步: 初始化一个连接 OSFactory.enableHttpLoggingFilter(true); //调试用,可以显示request body和response body Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); //创建router Router router = osclient.networking().router().create(Builders.router() .name("javaSDK-router-test") .build()); // 创建network,DNSNameServer参数请在官网页面创建subnet后获取默认值,各个region(比如华北区、华东区)不一样 Network network = osclient.networking().network() .create(Builders.network().name("javaSDK-net-test") .adminStateUp(true).build()) ; Subnet subnet = osclient.networking().subnet() .create(Builders.subnet().name("javaSDK-subnet-test") .networkId(network.getId()).cidr("192.168.45.0/24") .gateway("192.168.45.1").addDNSNameServer("100.125.1.250") .addDNSNameServer("114.114.114.114").enableDHCP(true).build()) ; System.out.println(subnet); // 将子网添加到router上 RouterInte**ce routerinf = osclient.networking().router() .attachInte**ce(router.getId(), AttachInte**ceType.SUBNET, subnet.getId()); // 删除上面所有资源 osclient.networking().router().detachInte**ce(router.getId(), subnet.getId(),routerinf.getPortId()); osclient.networking().subnet().delete(subnet.getId()); osclient.networking().network().delete(network.getId()); osclient.networking().router().delete(router.getId()); } } [/code]
  • 华为云API介绍(四)华为云Java SDK -云服务器ECS批量操作示例
    本帖最后由 Mercy 于 2018-3-27 10:29 编辑下面是Java SDK中批量操作云服务器的示例 [code]import java.util.List; import java.util.stream.Collectors; import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import com.huawei.openstack4j.api.Builders; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.api.types.ServiceType; import com.huawei.openstack4j.core.transport.Config; import com.huawei.openstack4j.model.common.ActionResponse; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.openstack.OSFactory; import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver; import com.huawei.openstack4j.model.compute.Action; import com.huawei.openstack4j.model.compute.RebootType; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.model.compute.Server.Status; import com.huawei.openstack4j.model.compute.ServerCreate; import com.huawei.openstack4j.model.compute.StopType; import com.huawei.openstack4j.openstack.loadbalance.domain.AsyncJob; public class Demo_for_ECS_batch { private static final String LANGUAGE = "zh-cn"; // 封装查询Job函数,返回失败子任务的ECS列表 public static ArrayList waitforJob(OSClientV3 osclient, String jobId, int TIMES, int interval) throws InterruptedException { for(int i=1;i=TIMES;i++) { Thread.sleep(interval*1000); AsyncJob Job = osclient.loadBalancer().jobs().get(jobId); if(Job.getStatus() == AsyncJob.Status.SUCCESS) { System.out.println("job success after " + i + " tries"); break; }else if(Job.getStatus() == AsyncJob.Status.FAIL){ System.out.println("job failed after " + i + " tries"); break; }else { continue; } } // 获取失败子任务列表 AsyncJob Job = osclient.loadBalancer().jobs().get(jobId); // 获取Job Object sub_jobs_obj = Job.getEntities().get("sub_jobs"); // 获取Job中的子任务列表 @SuppressWarnings("unchecked") List> sub_jobs_list = (List>)sub_jobs_obj; // 将子任务列表从Object转换为List ArrayList failed_serverIds = new ArrayList(); // 初始化失败子任务的server列表 for(Map sub_job : sub_jobs_list ) { Object entities = sub_job.get("entities"); // 获取子任务的entities,里面包含子任务对象 @SuppressWarnings("unchecked") Map entities_map = (Map)entities; if(!"SUCCESS".equals(sub_job.get("status"))) { System.out.println("status of sub job is " + sub_job.get("status")); failed_serverIds.add(entities_map.get("server_id")); // 获取成功失败子任务的虚拟机uuid } } return failed_serverIds; } public static void main(String[] args) throws InterruptedException { // 第一步:填入华为云区域的endpoint,如下,对接华北区1就需要填入华北区服务的endpoint OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver(); endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP, "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.DNS, "https://dns.myhuaweicloud.com/v2"); endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING, "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE, "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER, "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE, "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT, "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE, "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS, "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.Notification, "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue, "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s"); endpointResolver.addOverrideEndpoint(ServiceType.MAAS, "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage"); endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com"); /* 第二步: 配置鉴权信息(以对接华北区为例) * user为用户名 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID * authURL为IAM服务华北区的域名 */ String user = "wanglianmin-guest"; String password = "XXXXXX"; String projectId = "74610f3a5ad941998e91f076297ecf27"; String userDomainId = "2aa29cbca17a4822abd096610e378ffa"; String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3"; // 第三步: 初始化一个连接 OSFactory.enableHttpLoggingFilter(true); //调试用,可以显示request body和response body,正式使用时请注释掉此行 Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE) .withSSLVerificationDisabled(); OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId)) .scopeToProject(Identifier.byId(projectId)).authenticate(); // 批量创建虚拟机,填入所需参数;停止、启动、重启、删除虚拟机 String imageId = "e377c242-d74b-4e06-a0a4-2e25b8e7eef0"; String flavorId = "s2.small.1"; String networkId = "ef039b60-6a14-42d1-963b-687b627fea08"; // 创建Linux密码虚拟机,目前密码使用user-data参数传入,将来会统一使用adminPass参数 String userData_org = "#!/bin/bash \r\n echo ´root:P@ssWr0d123´ | chpasswd ;"; byte[] userData_byte = userData_org.getBytes(); String userData = new BASE64Encoder().encode(userData_byte); // generate networkList ArrayList networkList = new ArrayList(); networkList.add(networkId); // generate server body ServerCreate sc_Linux = Builders.server() .name("zt-Linux-test-sdk").flavor(flavorId) .min(50).max(50).image(imageId) .availabilityZone("cn-north-1b") .userData(userData) .networks(networkList).build(); System.out.println("New Server body " + sc_Linux); Server newServer = osclient.compute().servers().boot(sc_Linux); osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES); // 过滤查询弹性云服务器列表,等待所有ECS状态为ACTIVE Map filter_name = new HashMap(); filter_name.put("name", "zt-Linux-test-sdk"); List? extends Server> servers = osclient.compute().servers().list(filter_name); ArrayList serverIds = new ArrayList(); for (Server server : servers) { osclient.compute().servers().waitForServerStatus(server.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES); serverIds.add(server.getId()); } // 批量重启虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String rebootJobId = osclient.compute().serversV1().reboot(serverIds, RebootType.SOFT); ArrayList reboot_failed_serverIds = waitforJob(osclient, rebootJobId, 18, 10); System.out.println("List of reboot failed servers " + reboot_failed_serverIds); // 批量停止虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String stopJobId = osclient.compute().serversV1().stop(serverIds, StopType.SOFT); ArrayList stop_failed_serverIds = waitforJob(osclient, stopJobId, 18, 10); System.out.println("List of stop failed servers " + stop_failed_serverIds); if(stop_failed_serverIds.isEmpty()) { System.out.println("batch stop server success, jobId = " + stopJobId); }else { String stopJobId_sec = osclient.compute().serversV1().stop(stop_failed_serverIds, StopType.SOFT); ArrayList stop_failed_serverIds_sec = waitforJob(osclient, stopJobId_sec, 18, 10); System.out.println("Second List of stop failed servers " + stop_failed_serverIds_sec); } // 批量启动虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String startJobId = osclient.compute().serversV1().start(serverIds); ArrayList start_failed_serverIds = waitforJob(osclient, startJobId, 18, 10); System.out.println("List of start failed servers " + start_failed_serverIds); // 批量删除虚拟机,等待Job执行成功,请根据业务需要调整TIMES、interval参数 String deleteJobId = osclient.compute().serversV1().delete(serverIds, false, false); ArrayList delete_failed_serverIds = waitforJob(osclient, deleteJobId, 18, 10); System.out.println("List of delete failed servers " + delete_failed_serverIds); } } [/code]
  • 使用ServiceComb-javachassis如何在handler或者业务代码中取到HTTP header
    目前java-chassis可以在Handler中通过Invocation获取到调用必要的信息,从而完成打点治理等。在和第三方对接或者做认证鉴权的时候,需要在handler获取HTTP header,如果这些header信息在REST接口没声明,那么Handler就无法获取到。
  • 一文详解Java9 的11项新特性
    1、Java9新特性之---目录结构 包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图: 1116611167jdk9之后,目录结构发生变化如图: 11168这个新特性只要了解下就可以了,这个目录结构是方便为了接下来新特性做保证 2、Java9新特性之---JShell工具 怎么理解,怎么用呢?这个只是针对于java9来说,相当于cmd工具,你可以和cmd一样,直接写方法等等,不过我认为只是适用于初学者做一些最简单的运算和写一些方法: 在cmd中打开这个工具: 11169进入工具后可以做一些简单的java操作 11170。。。。等等,我认为只适用于初学者学习java不用其他编辑工具就可以学习java 3、Java9新特性之---模块化 一个大型的项目,比如淘宝商城等,都会包含多个模块,比如订单模块,前台模块,后台管理模块,广告位模块,会员模块.....等等,各个模块之间会相互调用,不过这种情况下会很少,只针对特殊情况,如果一个项目有30个模块系统进行开发,但是只要某个单独模块运行时,都会带动所有的模块,这样对于jvm来说在内存和性能上会很低,所以,java9提供了这一个特性,某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存中,这样性能大大的提高了。写法上如下: 11171一个项目中的两个模块,模块之间通过module-info.java来关联,在IDEA编辑器右键创建package-info.java 11172在这个两个模块java9Demo和java9Test中,java9demo编写一个实体类Person,在java9Test调用这样一个过程 这个是java9Demo 将 java9Test 模块需要的文件导出 exports 把它所在的包导出 11179然后在java9Test模块中创建一个package-info.java,引入java9Demo模块导出包名 11188这样就可以直接在java9Test中引入Person实体类了,这只是一个简单的例子。exports 控制着那些包可以被模块访问,所以不被导出的包不能被其他模块访问
  • [分享交流] 泛编程语言学习知识结构:JavaScript、Java、Python、Go
    主要是对于笔者这几年编程实践中,学习各个语言的过程中总结出来的共通的知识要点与体系结构的反馈。具体的 Java、JavaScript、Python、Go 的学习笔记可以参考 Domain-of-ProgrammingLanguage 与 Web 开发基础与工程实践;本文归纳的层次结构可以帮助初学者厘清语言中的知识组织,并且也可以作为个人笔记的目录结构。 因图片太大,需要查看原图的用户可回帖后点击附件下载。 [hide]11125[/hide]
  • [介绍/入门] 《Java Chassis通信处理详解》直播干货
    [*]直播回放:http://www.itdks.com/liveevent/detail/10012 [*]直播材料下载:https://github.com/apache/incubator-servicecomb-website/raw/master/assets/slides/20180208/Communications_Inside_Java_Chassis.pdf [*]互动环节获得激励名单: > flyingyizi > Jasonf6gp > ...msaq > 大王叫我巡山 > ayalei [*]大师风采: 11014 所有教程预告+材料汇总请移步:干货别错过!每周专家大咖直播+教程汇总{:9_88:}
  • JDK 10 本周将进入候选发布阶段,新特性抢先看
    Java 平台首席架构师 Mark Reinhold 近日在邮件列表上表示,按计划,JDK 10 将于 2 月 8 日星期四进入候选发布(Release Candidate)阶段。他建议 JDK 10 在该阶段采用和 JDK 9 相同的发布流程,将 Bug 修复分为 P1 - P5 五个不同的级别。候选阶段将重点修复那些能直接影响 JDK 10 能否成功发行的 P1 级错误,并将那些非关键或短期内无法解决的 P1 级错误推迟处理。此外,所有 P2 - P5 级的错误均留给后续版本修复。 JDK 10 的十二项新特性已确定,包括: JEP 286: 局部变量的类型推导。该特性在社区讨论了很久并做了调查,可查看 JEP 286 调查结果。 JEP 296: 将 JDK 的多个代码仓库合并到一个储存库中。 JEP 304: 垃圾收集器接口。通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。 JEP 307: 向 G1 引入并行 Full GC。 JEP 310: 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中。 JEP 312: 线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程。 JEP 313: 移除 Native-Header Generation Tool (javah) JEP 314: 额外的 Unicode 语言标签扩展。包括:cu (货币类型)、fw (每周第一天为星期几)、rg (区域覆盖)、tz (时区) 等。 JEP 316: 在备用内存设备上分配堆内存。允许 HotSpot 虚拟机在备用内存设备上分配 Java 对象堆。 JEP 317: 基于 Java 的 JIT 编译器(试验版本)。 JEP 319: 根证书。开源 Java SE Root CA 程序中的根证书。 JEP 322: 基于时间的版本发布模式。“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug 。 此外,JDK 11 的页面已经出现了四个 JEP ,包括:动态类文件常量(JEP 309,Dynamic Class-File Constants)、低开销垃圾收集器 Epsilon(JEP 318)、移除 Java EE 和 CORBA 模块(JEP 320),以及 Lambda 参数的本地变量语法(JEP 323)。JDK 11 计划于 2018 年 9 月发布,并有望成为新的 LTS 版本。
  • [问题求助] 2月8日晚20:00点直播预告:Java Chassis通信处理详解
    本帖最后由 李白云 于 2018-2-5 10:35 编辑10420 参与方式: 1 扫上图二维**名 ,并于周四晚 20:00 扫码观看 2 PC端通过网页报名和观看: http://www.itdks.com/liveevent/detail/10012 所有教程预告+材料汇总请移步:干货别错过!每周专家大咖直播+教程汇总 每周更新!{:4_87:}
  • [技术干货] 如何在JavaWeb项目中集成Springfox-Swagger-UI
    本帖最后由 DevCloud 于 2018-3-13 16:09 编辑本文将向大家演示如何在JavaWeb项目中集成Springfox-Swagger-UI。 一.相关信息 Swagger-UI简介10367 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。 Swagger UI是纯static的web程序,仅仅在页面加载的时候,调用http连接,获取yaml字符串或者json字符串, 将yaml文件和放到静态项目中,直观的显示接口信息。 二.集成步骤示例 1.添加SpringFox-Swagger的相关依赖 在项目中添加SpringFox-Swagger依赖,只需要在项目的pom.xml中添加如下代码即可: 10368其中jackson-databind是负责Json和Java对象之间的转化,SpringFox是负责swagger接口显示。 2.引入swagger相关Jar包文件 找到项目的springMvc.xml,在项目中引入swagger相关资源,代码操作如下: 10369 3.创建swaggerConfig文件 经过上述两步操作,我们已经可以使用swagger的相关注解。这时候,我们需要定义一个Config.java文件,这个文件的作用是定义接口页面(Swagger-ui.html)的一些重要信息。 10370上图两处红框位置,第一个红框:@注解来启用Swagger2。第二个红框: swagger-ui页面,导出json文件的地址。 定义好的Config.java文件也要添加到SpringMvc中(扫描到即可)。 4.添加@Api注解 经过上述三步操作,swagger-ui.html页面已经可以显示一些信息,但是因为我们没有通过Swagger指定接口,Swagger-ui.html页面是空白的。 想要显示接口信息,我们还要借助@Api以及其他以@Api开头的注解。 10371 @RestController表示Controller的返回方式 ,@RequestMapping 表示该Controller的请求路径,@Api 表示 这个接口在Swagger-ui中的请求路径Tags 中文名称。 前两个注解是ssm项目基本具备的,集成Swagger只需要添加@Api注解。 我们还给这个Controller中的每个方法增加了@ApiOperation注解。@RequestMapping中的method代表这个接口的请求类型,共四类:Get、post、put、delete@ApiOperation是对这个接口的描述:Value值是接口在swagger-ui中显示的信息。@ApiResponses 代表对返回值的处理。如图:如果返回405 提示:参数错误,返回其他,沿用系统默认提示。 至此,SpringFox-Swagger就集成成功了。 三.从项目中导出json项目部署成功后,在验证路径后面加上/swagger-ui.html 即可访问项目的swagger-ui( 114.115.137.228 是云主机地址)。在swagger-ui中可以看到各接口的详细信息。右键“右键另存为json”,保存链接即可获得接口测试的脚本模板。 10372
  • 编程语言简史:有人讨厌花括号,于是他发明了Python
    编程语言有上千种,但是流行的不过10来种,那些我们经常使用的编程语言都是谁在什么时候创造出来的呢?Casper Beyer 为我们进行了整理。 98151800年 Joseph Marie Jacquard 教会了一台织布机读穿孔卡片,制造出了第一个高度多线程的处理单元。他的发明受到了预见天网(Skynet)诞生的纺织工人的强烈反对。 1842年 Ada Lovelace(英国诗人拜伦之女)为计算程序拟定“算法”,写作的第一份“程序设计流程图”,被珍视为“第一位给计算机写程序的人”。稍微有点不便的是当时还没有计算机呢。 1936年 阿兰·图灵被称为计算机科学之父,人工智能之父。但英国法庭却并不认可,还判处对他进行化学阉割。 女皇后来宽恕了他,但不幸的是当时他已经过世很久了。 1936年 Alonzo Church(算法理论重要奠基人)发明了lambda算子,跟图灵生活在同样的时代,但是他在时代的另一边,也并没有被女王阉割。 1957年 John Backus创建了FORTRAN语言,这真正是程序员使用的第一种语言。 1959年 Grace Hopper发明了第一门针对企业面向商业的编程语言,并且把这门语言叫做“面向商业的通用语言(common business-oriented language)”,简称COBOL。 1964年 John Kemeny 和 Thomas Kurtz 认为编程太难了,需要回归本源,他们把自己的编程语言叫做BASIC。 1970年 Niklaus Wirth开发了多种语言,最后流行起来的是PASCAL。他喜欢开发语言。 他还发明了让摩尔定律变得过时的Wirth定律(软件变慢的速度比硬件变快的速度更快),因为软件开发者会编写出连大型主机也没法跟上的臃肿软件。 这在后来被证明是正确的——在Electron.js被发明出来后 1972年 Dennis Ritchie在贝尔实验室上班上到无聊了,于是他决定写出带有花括号的C语言,这门语言取得了巨大成功。随后他又增加了分段错误等对开发者友好的功能来辅助提高生产率。 折腾完这门语言之后他还有时间,于是他跟在贝尔实验室的伙计决定给C语言做个演示程序,结果他们弄出了一个操作系统,UNIX。 1980年 Alan Kay发明了一门面向对象语言,他把这门语言叫做Small**,在Small**中一切都是对象,甚至一个对象也是对象。没人真正搞得清楚small **是什么意思。 1983年 Jean Ichbiah注意到Ada Lovelace的程序从来都没有实际运行过,决定以她的名字开发一门语言,但是这门语言还是没有跑起来。 1983年 Bjarne Stroustrup 注意到C在编译方面花的时间还不够多,于是他把自己能想到的每一项功能都增加了进去,然后称之为C++。 每一个地方的程序员都接受了它,因为这样他们在工作的时候找借口看阿猫阿狗视频和xkcd漫画就显得比较有诚意了。 1986年 Brac Box 和 Tol Move决定在Small**的基础上制作一个C语言的不可读版本,他们把这门语言叫做Objective-C,但是没人弄得清楚它的语法。 1987年 Larry Wall有宗教经验,他成为了一名牧师,并且把Perl变成了一种教义。 1991年 Guido van Rossum不喜欢花括号,于是他发明了Python,语法选择的灵感来源自Monty Python(巨蟒剧团)和Flying Circus(飞行马戏团)。 1993年 Roberto Ierusalimschy和他的朋友认为自己需要一个巴西本地化的脚本语言,在本地化期间发生了一个错误,这个错误会把指针从1而不是0开始计算,他们把这门语言叫做Lua。 1994年 Rasmus Lerdorf给他个人主页的CGI脚本做了一个模板引擎,后来他把自己的资料都放到了网上。 世界决定将这些东西用到一切,Rasmus于是匆忙地将一些数据库绑定做了进去,并把这门语言叫做PHP。 1995年 Yukihiro Matsumoto不是很高兴,因为他注意到其他程序员不是很高兴。他创建了Ruby来让程序员高兴。在他创建了Ruby后“Matz”高兴了,Ruby社区高兴了,每个人都高兴了。 1995年 Brendan Eich利用周末时间设计了一门语言,打算用这门语言来为全世界的每一个主流浏览器乃至于最终的Skynet都提供动力。 他先是找到了Netscape然后说这门语言叫做LiveScript,但在代码评审期间Java变得流行起来,所以他们决定最好还是用花括号,然后就把它更名为JavaScript。 结果表明,Java却是一个会让他们惹上麻烦的商标,JavaScript随后更名为ECMAScript,但大家还是把它叫做JavaScript。 1996年 James Gosling发明了Java,第一们真正过于繁琐的面向对象语言,在这里设计模式完全压倒了实用主义。 于是就诞生了超级有效的管理器提供商、容器提供商、服务提供商、单一管理器提供商模式。 2001年 Anders Hejlsberg重新发明了Java然后把它叫做C#,因为用C来编程感觉要比Java酷。每个人都喜欢这个新版本的Java,因为它完全不像Java。 2005年 David Hanselmeyer Hansen创建了一个web框架叫做Ruby on Rails,从此大家不再记得Ruby和Rails是两个独立的东西了。 2006年 John Resig为JavaScript写了一个帮助库,每个人都以为那是一门语言,从此从互联网上拷贝粘贴jQuery代码就成为了一门职业。 2009年 Ken Thompson 和 Rob Pike 决定做一门类似C那样的语言,但要有更安全的装置,还要有更好的卖相,并且把Gopher(囊鼠)作为吉祥物。 他们把这门语言成为Go,并把它做成开源然后另外卖Gopher商标的护膝和头盔作为收入来源。 2010年 Graydon Hoare也想把语言做成C那样,他称之为Rust。每个人都要求马上用Rust把软件的每一块都重写一遍。Graydon希望做点更有亮点的事情,于是开始为苹果开发Swift。 2012年 Anders Hjelsberg希望在web浏览器里面写C#,于是他设计出TypeScript,这东西其实是JavaScript,但里面有了更多的Java的东西。 2013年 Jeremy Ashkenas想要像Ruby开发者一样快乐,于是他创建了CoffeeScript,这东西编译后像JavaScript但是样子又更像Ruby。Jerry从来都没有变得像Matz和Ruby开发者那样真正快乐。 2014年 Chris Lattner做Swift的时候,其主要的设计目标就是不要成为Objective-C,最后它看起来像Java。
  • [分享交流] 【干货分享】华为云API介绍(三)华为云Java SDK 使用指导
    前提条件1.        已经获取相关API文档。       登录华为云官网 http://support.huaweicloud.com  查看各个云服务的接口参考文档。       通过这些文档,可以学习云平台所支持的API参数。2.        获取Java SDK(jar包)及其介绍文档       登录以下网站获取Python OpenStack SDK 的官方文档:       http://developer.huaweicloud.com/dev/sdk?all3.        获取华为云IAM鉴权信息和endpoint信息。          projectId/userDomainId参数获取方法见: http://forum.huaweicloud.com/forum.php?mod=viewthread&tid=1813        endpoint/AZ信息见: http://developer.huaweicloud.com/endpoint.html4.        开发环境已经安装好JDK 1.85.        欲了解Java SDK项目的源代码,请访问如下地址。       https://github.com/huawei/openstack4jJava代码示例DNS服务的简单Demo:创建zone、查询zone、删除zonepackage openstack4jdemo;import java.util.List;import com.huawei.openstack4j.core.transport.ProxyHost;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.model.dns.v2.Zone;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.dns.v2.domain.DesignateZone;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;public class dns_test {        private static final String LANGUAGE = "zh-cn";        public static void main(String[] args) {                // step 1: add cloud service override endpoint   注意:示例中endpoint都使用华北区的,如果需要在华南区操作资源,需要相应修改为华南区的endpoint                OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver();                endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP,                                "https://vbs.cn-north-1.myhwclouds.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.DNS,                                "https://dns.myhwclouds.com/v2");                endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING,                                "https://as.cn-north-1.myhwclouds.com/autoscaling-api/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE,                                "https://ces.cn-north-1.myhwclouds.com/V1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER,                                "https://elb.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE,                                "https://mrs.cn-north-1.myhwclouds.com/v1.1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT,                                "https://kms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE,                                "https://cts.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS,                                "https://antiddos.cn-north-1.myhwclouds.com/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.Notification,                                "https://smn.cn-north-1.myhwclouds.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue,                                "https://dms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAAS,                                "https://maas.cn-north-1.myhwclouds.com/v1/%(project_id)s/objectstorage");                endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhwclouds.com");                // step 2: setup the authentication credit                String user = "wanglianmin";                String password = "XXXX";                String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";         //  华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,项目ID,按照region区分,如果想在华北创建资源,就找cn-north-1对应的项目ID。                String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";     //  华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,账户ID,各个区域统一。                String authUrl = "https://iam.cn-north-1.myhwclouds.com/v3";                // step 3: initial OpenStack4j Client                OSFactory.enableHttpLoggingFilter(true);                // config of the client                // with language setting is required for RDS(trove&database) service                Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE)                                .withSSLVerificationDisabled();                // initial client                OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl)                                .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId))                                .scopeToProject(Identifier.byId(projectId)).authenticate();                // // use client to visit DNS API                //                // create a public zone                Zone creation = DesignateZone.builder().name("sdk.tutorial.com.").description("tutorial").ttl(600)                                .email("admin@tutorial.com").build();                Zone zone = osclient.dns().zones().create(creation);                // get the created zone                Zone get = osclient.dns().zones().get(zone.getId());                // delete the created zone                //osclient.dns().zones().delete(get.getId());                List list = osclient.dns().zones().list();                System.out.println(list);                               // delete zone                osclient.dns().zones().delete(get.getId());        }}[/code]再来一个ECS弹性云服务器的示例,包括查询Server、创建Server、启动、停止、重启、删除Server[code]import java.util.List;import java.util.stream.Collectors;import sun.misc.BASE64Encoder;import sun.misc.BASE64Decoder;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeUnit;import com.huawei.openstack4j.api.Builders;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.ActionResponse;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;import com.huawei.openstack4j.model.compute.Action;import com.huawei.openstack4j.model.compute.RebootType;import com.huawei.openstack4j.model.compute.Server;import com.huawei.openstack4j.model.compute.Server.Status;import com.huawei.openstack4j.model.compute.ServerCreate;public class Demo_for_WebSite {        private static final String LANGUAGE = "zh-cn";        public static void main(String[] args) {                /* 第一步:填入华为云区域的endpoint                 * 如下,对接华北区1就需要填入华北区服务的endpoint,以下为全量服务,用户根据自己的需要进行覆写                 */                OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver();                endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP,                                "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.DNS,                                "https://dns.myhuaweicloud.com/v2");                endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING,                                "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE,                                "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER,                                "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE,                                "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT,                                "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE,                                "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS,                                "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.Notification,                                "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue,                                "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAAS,                                "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage");                endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com");                /* 第二步: 配置鉴权信息(以对接华北区为例)                 * user为用户名                 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID                 * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID                 * authURL为IAM服务华北区的域名                 */                String user = "wanglianmin";                String password = "XXXXXX";                String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";                String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";                String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3";                // 第三步: 初始化一个连接                OSFactory.enableHttpLoggingFilter(true);   //调试用,可以显示request body和response body                Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE)                                .withSSLVerificationDisabled();                OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl)                                .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId))                                .scopeToProject(Identifier.byId(projectId)).authenticate();                // 第四步: 过滤查询弹性云服务器列表                Map filter_name = new HashMap();                filter_name.put("name", "ecs");                filter_name.put("status", "ACTIVE");                List servers = osclient.compute().servers().list(filter_name);                System.out.println(servers);                               // 第五步:创建虚拟机,填入所需参数;停止、启动、重启、删除虚拟机                String imageId = "1189efbf-d48b-46ad-a823-94b942e2a000";                String flavorId = "s2.small.1";                String networkId = "ef039b60-6a14-42d1-963b-687b627fea08";                String imageId_Windows = "201150a6-479e-45f3-8a4c-fe91855758f0";                                              // 创建Linux密码虚拟机,目前密码使用user-data参数传入,将来会统一使用adminPass参数(注意echo后面的是单引号,单引号!!!)                String userData_org = "#!/bin/bash \r\n echo ´root:P@ssWr0d123´ | chpasswd ;";                byte[] userData_byte = userData_org.getBytes();                String userData = new BASE64Encoder().encode(userData_byte);                // generate networkList                ArrayList networkList = new ArrayList();                networkList.add(networkId);                // generate server body                ServerCreate sc_Linux = Builders.server().name("zt-Linux-test-sdk").flavor(flavorId).image(imageId).availabilityZone("cn-north-1b").userData(userData).networks(networkList).build();                System.out.println("New Server body " + sc_Linux);                Server newServer = osclient.compute().servers().boot(sc_Linux);                osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES);                System.out.println("New Server " + newServer);                                                              // 创建Windows密码虚拟机,目前密码使用metadata参数传入,将来会统一使用adminPass参数                ServerCreate sc_Windows = Builders.server().name("zt-Windows-test-sdk").flavor(flavorId).image(imageId_Windows).availabilityZone("cn-north-1b").addMetadataItem("admin_pass", "P@ssWr0d123").networks(networkList).build();                System.out.println("New Server body " + sc_Windows);                Server newServer_Windows = osclient.compute().servers().boot(sc_Windows);                osclient.compute().servers().waitForServerStatus(newServer_Windows.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES);                System.out.println("New Server " + newServer_Windows);                                     // 停止虚拟机                ActionResponse repStop = osclient.compute().servers().action(newServer.getId(), Action.STOP);        if(repStop.isSuccess()) {            System.out.println("Stop the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Stop the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.SHUTOFF, 3, TimeUnit.MINUTES);                // 启动虚拟机        ActionResponse repStart = osclient.compute().servers().action(newServer.getId(), Action.START);        if(repStart.isSuccess()) {            System.out.println("Start the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Start the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES);                // 重启虚拟机                ActionResponse repReboot = osclient.compute().servers().reboot(newServer.getId(), RebootType.SOFT);        if(repReboot.isSuccess()) {            System.out.println("Reboot the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Reboot the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES);                // 删除虚拟机        ActionResponse repDelete = osclient.compute().servers().delete(newServer.getId());        if(repDelete.isSuccess()) {            System.out.println("Delete the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Delete the server failed " + newServer.getId());        }                ActionResponse repDelete_Windows = osclient.compute().servers().delete(newServer_Windows.getId());        if(repDelete_Windows.isSuccess()) {            System.out.println("Delete the server success, status = " + newServer_Windows.getId() + newServer.getVmState());        }else {            System.out.println("Delete the server failed " + newServer_Windows.getId());        }                }        
  • 号称“编程语言年”的 2017 ,都发生了哪些大事?
    Infoworld 消息, 2017 年,Java、JavaScript、Kotlin、TypeScript 、 C ++ 等编程语言的特性都迎来了较大变化。总的来说,这一年不管是老牌的语言,还是新兴语言,都有了不同程度的改进。 Java 期待已久的 JDK 9 在 9 月正式发布了,作为 Java 标准的最新实现,曾因为其模块化技术引起争议。尽管模块化系统旨在提供可伸缩性,性能和安全性方面的优势,但包括 Red Hat 和 IBM 在内的关键参与者却不同意 Oracle 实施它。他们对应用的兼容性表示担忧,并对最初的建议投了反对票。直到最后的再次修改,才让反对方感到满意,通过了复审提案,为迟迟不能发布的版本扫清了道路。 下一个版本 JDK 10 计划将在 2018 年 3 月迅速推出,具有局部变量的类型推导和垃圾收集器接口等特性。 而 Java EE ,甲骨文已将其交由 Eclipse 基金会管理。同时,Oracle 在发布 Java 9 的同时也发布了 Java EE 8 。 Java EE 8 包含云、HTML5 和 HTTP / 2 等特性。 JavaScript 在 Web 开发中,2017 年许多 JavaScript 工具迎来了大版本更新,包括: 11 月的 Angular 5:包含一个构建优化器,支持渐进的网络应用程序和 Material Design 组件。 9 月的 React 16 :重写了 React 内核以提高对复杂应用程序的响应速度。 3 月的 Angular 4 :专注于构建更小的应用。 同时,TypeScript 也迎来多次更新: 11 月的 TypeScript 2.6 具有严格的模式标记和错误抑制注释。 8月的 TypeScript 2.5 使得复杂的重写变得更容易。 6 月的 TypeScript 2.4 具有动态展示功能,使应用更加节省资源。 4 月的 TypeScript 2.3 支持 ECMAScript 异步生成器和迭代器。 2 月的 TypeScript 2.2 强调与 React Native 框架的兼容性,以更好地构建原生移动应用。 即将于 2018 年 1 月推出的 TypeScript 2.7,将改进对象字面量的类型推断。 Kotlin 成为 Android 官方支持开发一级语言的 Kotlin 在 2017 年时一颗冉冉升起的新星, 2017 年推出的版本包括: Kotlin 1.2 于 11 月发布,提供在多个平台上重复使用代码的实验性功能。 支持 Java 9 。 Kotlin 1.1 于 3 月发布,提供了对 JavaScript 支持。 C ++ 今年等到了 C ++ 17 的发布,重点在于使语言更易于使用,提升编程便利。 接下来是 C ++ 20 ,预计将于 2019 年夏季完成功能并于 2020 年发布。它计划包含对并发性和库特性的改进。 此外,还值得一提的是微软在 12 月推出了 Q#量子编程语言,它将传统的编程概念如函数、变量、分支、以及语法高亮的开发环境和量子调试器带到量子计算领域。该语言与主要与 Visual Studio IDE 协同工作,并在 Quantum 开发工具包中集成推出。
  • 下一代Java新特性展望——Java JDK 10
    本帖最后由 码小玩 于 2017-12-27 09:55 编辑今天推荐的内容包括:Java JDK 10:下一代Java新特性展望、我们该如何在敏捷软件开发领域始终占据优势、开源软件业务中的四大核心成功模式和区块链技术的十种重要现实用例等。 7757 一、Java JDK 10:下一代Java新特性展望 原文标题:Java JDK 10: What new features to expect in the next Java 开发者朋友们可能已经习惯了2017年9月发布的Java 9,但距离下一代Java的正式面世只剩下几个月时间。今年12月中旬,计划内的Java Development Kit 10升级正逐渐放缓脚步。在今天的文章中,我们将对Java JDK 10作出全面概述。 1. JDK何时正式发布 2. 在哪里下载JDK 10 3. JDK 10中的新型与改进功能 4. JDK 10的预期发展阶段 5. Java长期发展路线图 二、我们该如何在敏捷软件开发领域始终占据优势? 原文标题:How to excel in agile software development 7758 如果你身为领导者或者正参与敏捷开发流程,且选择了Scrum等敏捷模式,那么接下来无疑需要建立基本流程以确保产品所有者、客户需求同开发团队之间协调一致,从而顺利实现结果。那么,对于相关负责团队来说,他们该如何确保应用能够随时准备就绪,采用简化流程,从而将变的更轻松推向生产环境及其它计算环境?在今天的文章中,我们将逐步找出答案。 1. 在敏捷开发中定义并解决技术债务 2. 在敏捷开发中实现质量保证 3. 发现代码分支标准 4. 利用代码审查提升质量与开发者协作性 5. 实现持续集成与持续交付 6. 利用敏捷驱动自动化与流程改进 三、开源软件业务中的四大核心成功模式 原文标题:4 successful open source business models to consider 在第一次接触开源时,我感到其建立业务的思路似乎有些反直觉。然而,随着对这一活动的愈发熟悉,我意识到开源软件公司并不是什么天方夜谭。正如GNU项目创始人Richard Stallman所言,“Free是指自由而非免费”。而如果屏幕前的你有意以开源为核心建立一家企业,那么,以下四种成功模式无疑值得考量。 1. 支持与服务 2. 付费额外功能 3. SaaS 4. “打赏”或“付费获取需要的功能” 四、区块链技术的十种重要现实用例 原文标题:How to Use Blockchain: 10 Use Cases 许多专家预测,区块链技术将很快对全球企业产生巨大影响。Gartner将其视为“将引发整个行业的改革”,而Forrester则认为只要得到适当实施,区块链将能够支持新的业务与信任模式。但抛开这些乐观的整体性展望,我们具体该将其怎样落地到实际用例当中?今天的文章将给出一些令人信服的思路。 1. 食物(及其它货物)追踪 2. 安全软件开发 3. 数字化内容管理 4. 医疗记录 5. 贷款审批 6. 保险理赔 7. 审计追踪 8. 投票 9. 智能合同 10. 加密货币
  • 回顾 2017, Java 有哪些重大变化值得关注?
    在过去的一年中,Java 历经了许多变化。在今年年初,Java EE 处于一个不确定的状态,Java 9 版本也推迟了它的发布日期。在 2016 年的 JavaOne 上,甲骨文宣布了解决平台的计划和 Java SE 9 和 OpenJDK 9 的相关信息。 2017年6月,Java Community Process 执行委员会投票通过了被称为 JSR 376 的 Java 平台模块系统,该平台为 Java 9 奠定了基础。 2017 年 8 月,甲骨文宣布要将 Java EE 转移到开源阵营。一个月后,Oracle 将 Java EE 转移到 Eclipse 基金会,Oracle 也继续支持现有的 Java EE 许可证。据甲骨文公司说,迁移到 Eclipse 基金会使组织能够采用更灵活的方式管理。 Eclipse 基金会还有许多其他开源项目和基于社区的治理方法来加强项目合作和快速创新。 2017 年 9 月,Java 9 发布了。它具有模块化架构,而不是 Java 以前版本中的单片架构。这样可以在较小的设备上实现可扩展性,这本应该是 JDK 8 中应包含的功能,但在 JDK 8 发布时尚未准备就绪。 JShell 在 Java 中增加了 Read-Eval-Print-Loop 功能,允许开发人员在编写代码时获得即时反馈,这对初学者甚至有经验的 Java 开发人员尝试新的 API,库或功能都很有帮助。还有几个其他新功能可以改进 JVM 的编译和性能,以及增强核心库。 在 2017 年 9 月的 JavaOne 上,一个名为 Java Guardians 的组织试着让 Oracle 给 Java EE 更大的关注来向前迈进,甲骨文终于开始谈论 Java EE,并表示计划在 2017 年完成并发布它。然而到了 2016 年 7 月份,开发人员仍然在等待 Java EE 更新的消息,在那期间也没有关于 Oracle 的消息。 同样在 9 月,Oracle 建议对 Java SE 和 JDK 发布周期进行更改,使得版本更加灵活。它希望从 2018 年3 月起每 6 个月发布一次重要版本,Java 9 更新版本将继续每季度发布一次,并且每三年会发布一次大版本。 在 2017 年 10 月的 JavaOne 上,提供的几个软件工具已经宣布的新服务。Parasoft 发布更新了 Jtest,这是一个Java 的单元测试助手。JNBridge 发布了 Java.VS,这个插件允许开发人员在 Visual Studio 中编写 Java 代码。Java.VS 还有 Java 代码编辑器,Java 项目系统,并允许 Java 开发人员使用 VS 构建系统和调试器接口的功能。
总条数:2294 到第 页
上滑加载中