go通过调用java的jar包来解决go生态轮子不足的问题

作者:白话软硬件 发布时间:2022-04-02

        这两天有一个应用需要做一下附近的人,底层想采用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"?>

<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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.yurongbj</groupId>
  <artifactId>lucene_lbs</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>lucene_lbs</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.yurongbj.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.0.M2</version>
    </dependency>
    <!-- lucene全文搜索引擎  -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>9.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analysis-smartcn</artifactId>
        <version>9.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queries</artifactId>
        <version>9.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-spatial3d</artifactId>
        <version>9.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-spatial-extras</artifactId>
        <version>9.0.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!-- 此处为程序主入口-->
                        <mainClass>com.yurongbj.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin> 
          <artifactId>maven-assembly-plugin</artifactId> 
          <configuration> 
            <archive> 
              <manifest> 
                <mainClass>com.yurongbj.App</mainClass> 
              </manifest> 
            </archive> 
            <descriptorRefs> 
              <descriptorRef>jar-with-dependencies</descriptorRef> 
            </descriptorRefs> 
          </configuration> 
        </plugin>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

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包。

微信截图_20220402121840.jpg

【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个参数"
【声明】:LifeAdd生活方式登载该文章目的是为更广泛的传递行业信息,不代表赞同其观点或证实其描述,本网站亦不为其版权负责。若无意侵犯您合法权益的内容,请联系本网站,核实后将立即予以删除!
标签: go调用java go调用jar包

高品质生活资讯平台

『LifeAdd生活方式』是一家引领高端品质生活的互联网平台,聚焦前沿时尚风潮,为高品质人群推送生活资讯和商业信息,链接高端商业与高端人群生态圈。

业务范围

经营规则

联系我们
北京市丰台丽泽金融商务区平安幸福中心A座7层
82918700@qq.com
微信号:82918700

2013-2024 LifeAdd生活方式 www.lifeadd.cn 版权所有 | 御融(北京)科技有限公司 All Rights Reserved
增值电信业务经营许可证:京B2-20200664 | 京ICP备14004911号-7