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个参数"
买投影仪还是大屏幕电视?分界线是一万,因为红米98寸的定价就是一万,且不论效果如何,在这里想说的是如果想要液晶电视有大屏的观影体验,预算是一万起步的。在这个价格之下,想要大屏的体验,可能就得考虑使用投影仪
净水器十大名牌现在,随着人们生活水平的提高,越来越多的家庭不再满足于家庭硬装,而是将目光放在了能够提升生活健康水平的家装项目上,净水器就在这样的风潮当中走入了千家万户。但是现在销售净水器的品牌太
荣耀30更新鸿蒙系统2。0。0。165版本,小伙伴们赶紧下载升级哦荣耀30更新HarmonyOS2。0。0145版本已有好长时间了,上周有其他版本手机更新了最新的165版本,我心激动,赶紧去试了试,结果没有捂脸有点失望!今天终于推送了更新,赶紧下
iOS15Beta6发布,功能增删抢先看苹果在今天凌晨向全体开发者用户发布了以下系统更新iOS15beta6(19A5325f)iPadOS15beta6(19A5325f)tvOS15beta6(19J5332e)wa
大屏观赛才够爽!推荐七款3000元价位平板电视如今的电视越来越智能,价格也跟着猛涨。但大多数人还是会选择3000元价位的电视,画质功能等能满足使用需求,价格也能接受。下面推荐几款定位3K档位的平板电视,在各方面表现都很出色,性
2021年上半年六大拍照手机闭着眼跟着买就对今天,我就来为大家盘点一下2021年上半年的十大拍照手机(产品发布时间为2021年1月至今)。如果各位感兴趣的话,不妨跟着我一起来感受一下这十款手机的拍照魅力。以下产品不分排名先后
国产手机谁是卷王?太好看了,我说的是iQOO产品经理宋姐姐。如果你没看过,肯定见过。这个产品一发布,这个姐姐一登场,那全场真是嗨爆了!以至于人家根本就没有关心发布会到底是什么产品鼾睡害羞结果呢,其他
苏宁818战报出炉小米夺冠无悬念,华为表现令人尊敬如果说618属于京东,双11属于天猫,那么818肯定就是属于苏宁的。作为线上最大电商平台之一,看着京东618天猫双11玩得那么嗨,苏宁当然不会落后就搞出一个818狂欢节。在2021
好用的手机桌面便签app下载哪款?在人们使用手机的时候,经常会碰到各种各样的软件app,通过下载安装它们,就可以获得不同的功能。便签app是很多人都在使用的一种辅助工具,其中手机桌面便签app尤为受欢迎,好用的手机
小米MIX4搭载的UWB技术是什么?为何它可能会颠覆智能家居行业?在小米十一周年的雷军年度演讲大会上,小米发布了时隔3年之久的小米MIX4手机,除了采用了前沿的屏下摄像头技术以外,还首次搭载了UWB技术。对于大部分人来说,UWB技术可以说十分的陌
ROG新机还能这么玩?差评体验官现场演示个性视窗以及双腰键体验8月18日晚,ROG召开了ROG电音潮玩夜活动,正式带来了2021下半年的新旗舰ROG游戏手机5sPro,在外观配置屏幕以及操控等方面都作出了一定程度的更新。值得一提的是,此次RO