Go通过调用java的jar包来解决go生态轮子不足的问题
这两天有一个应用需要做一下附近的人,底层想采用lucene的lucene-spatial3d来做LBS,但go语言没有lucene的完整第三方包,轮子不足只能采用go调用java的方式解决。
第一种思路是想采用Netty来建立一个服务,然后go采用网络请求的方式来调用服务接口,但这种方式需要常驻一个服务,虽然资源用不了多少,但也是会一直跑着一个进程,斟酌再三决定放弃这种思路。
第二种思路是go直接调用java写的jar包,用的时候调用执行,用完不会有进程常驻,对服务器资源合理使用更优。下边就简单介绍一下此种方式的操作(具体用Lucene做LBS业务逻辑此文省去,此文重点介绍如何go调用jar包进行交互处理)。
【Java工程】
1、首先创建一个Maven工程,生成的pom.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> 4.0.0 com.yurongbj lucene_lbs 1.0-SNAPSHOT lucene_lbs http://www.yurongbj.com UTF-8 1.7 1.7 cn.hutool hutool-all 5.8.0.M2 org.apache.lucene lucene-core 9.0.0 org.apache.lucene lucene-analysis-smartcn 9.0.0 org.apache.lucene lucene-queries 9.0.0 org.apache.lucene lucene-spatial3d 9.0.0 org.apache.lucene lucene-spatial-extras 9.0.0 junit junit 4.11 test org.apache.maven.plugins maven-jar-plugin 3.1.0 true com.yurongbj.App maven-assembly-plugin com.yurongbj.App jar-with-dependencies maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0
2、入口文件App.java package com.yurongbj; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.HexUtil; /** * 公司:御融(北京)科技有限公司 * 作者:softHardware * 描述:用于建立附近的人索引和搜索,。 */ public class App { public static void main( String[] args ) { if(args.length==0){ System.out.println( "error" ); return; } if(args.length==1){ //将中文内容转换为16进制字符串,如果不转换直接输出,Go读取的中文解析内容会不正常。 String hex = HexUtil.encodeHexStr("缺少参数,至少2个参数", CharsetUtil.CHARSET_UTF_8); System.out.println(hex); return; } String arg = args[0]; if(arg.equals("index")){ //获取内容,创建索引 System.out.println( args[1] ); } if(arg.equals("search")){ //获取内容,搜索附近5KM数据 System.out.println( args[1] ); } } }
3、使用带依赖jar包打包命令进行编译打包
命令:mvn assembly:assembly(注意在pom.xml中引入对应的插件maven-assembly-plugin)
4、打包成功后,在工程目录target文件夹下即可看到生成的jar包:lucene_lbs-1.0-SNAPSHOT-jar-with-dependencies.jar,此文件即为下文GO工程中待调用的jar包。
【Go工程】
1、创建Go工程(具体创建方法请自行查阅Go工程创建方法)
2、入口main.go文件调用测试 package main import ( "encoding/hex" "fmt" "os/exec" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/util/gconv" ) func main() { //调用刚才打包的jar包,此处故意传入一个参数来验证返回值为"缺少参数,至少2各参数" cmdJava := exec.Command("java", "-jar", "lucene_lbs-1.0-SNAPSHOT-jar-with-dependencies.jar", "index") out, err := cmdJava.Output() if err != nil { println("java error:", err.Error()) } hexStr, hexErr := hex.DecodeString(string(out)) if hexErr != nil { println("java hexErr:", hexErr.Error()) } println("hexStr:", hexStr) res := gconv.String(hexStr) fmt.Printf("call java: %qn", res) }
3、将生成的lucene_lbs-1.0-SNAPSHOT-jar-with-dependencies.jar文件拷贝到和main.go相同的目录下,执行命令进行测试: go run main.go
输出如下内容则代表调用成功: call java: "缺少参数,至少2个参数"
刚刚,印度车企发布的这款车,居然在中控内饰上种花说起印度,不少人会对这国家的电影或者小吃印象更深刻,作为全球第二大人口国,经济发展也是日益增长,那印度的汽车工业如何?还是那家在海外通过收购并购的模式发展?今天看完这款概念车,或许
又一国产黑马出现!堪比小华为,70员工做研发,对手英伟达芯片,这两个字一直是我国产业之痛,很多人把芯片理解为CPU,认为芯片就是电脑用芯片手机用的芯片,实际上芯片不仅仅包含这些,还包含驱动芯片电池芯片AI芯片等等,即便是我们手里面的银行
五一长假来了,劳斯莱斯库里南推出旅行套装,绝对是奢侈旅行必备库里南绝对是劳斯莱斯车系中的另类,于2018年上市,当年也是劳斯莱斯年轻化的纪年,但是其骨子里还是一辆超豪华品牌的SUV。SUV就是一辆多用途汽车,库里南也不例外,穿州过省长途旅行
三星MicroLED困境巨量转移难题未解,成本下降之路艰巨三星在MicroLED领域的动作不断,年初三星发布了110吋MicroLED电视,预测三星将新增MicroLED电视生产线,并计划在2021年底前依序推出99寸88寸与76寸的三星
3款大空间67座MPV推荐,比SUV更实用近年,国内消费者对MPV需求日渐提高,多座位的设定对于人员较多的家庭,外出时能满足全家成员乘坐需求,都坐在一辆车愉快出行更合适,而且长期计算,出行费用也会比开多辆车要划算。7座车型
选择自动洗碗机的经验知识我们不仅要注重价格,还要注重设备的性能,配置和功能以及实际操作等。洗碗餐具消毒设备有效果吗?一套要多少钱?想开一个餐具消毒公司的人一开始都会提这样的问题。首先,需要根据各自的情况使
商用自动洗碗机的正确使用方法商用自动洗碗机通常是长龙洗碗机。在洗涤过程中,有必要人工将餐具正确摆放在履带上,通过传动系统带动餐具从一侧移动到另一侧,实现了餐具的自动洗涤过程。因此,省去了篮传式洗碗机的装筐步骤
开箱评测光威弈Pro笔记本内存国产颗粒,圆梦强国开箱评测光威弈Pro笔记本内存国产重器,圆梦强国充满不幸的2020终于过去,疫情爆发停工停产医疗设备需求暴增代工厂产能不足线上办公远程课堂引发计算机需求旺盛,但这其中,存储芯片却价
传MacBooks评估OLED技术,OLED笔记本电脑渗透率有望逐步提升据供应链消息称,苹果开始评估将OLED技术应用于MacBooks等IT产品,并正在与韩国两大面板制造商讨论,以尽量减少与现有LCD产品相比增加的成本。这是继苹果计划在2023年至2
自动洗碗机的维护保养知识1。定期测试清洗机的绝缘性能。定期检查老化的电气部件和接地线。清洗机应确保设备接地良好。项目必须由经验丰富的电工执行2。定期测试洗碗机的电源,确认其满足设备的电源电压要求,避免在过
自动商用洗碗机的维护知识关机后1。关闭洗碗机机电系统,打开检查门,拆下机内主洗涤缸上上喷淋管的堵头进行清洗。如果有任何废物堵塞,应予以清除。2。拆下前中后悬挂的雨帘,并清洗干净。3。打开机器内排水管的电源