SpringBoot+Maven整合SuperMap iObjects Java进行开发

之前曾经介绍过如何在Eclipse里通过iObjectsJava搭建Web开发环境,当时采用的还是传统的Java Web Application的方式进行开发。随着Java技术的发展,这种模式已经越来越跟不上开发的潮流了。

时下SpringBoot已经成为了事实上的开发标准,SpringCloud也正和Docker一起进行的如火如荼。所以,再不跟上时代的步伐,就要被这个时代所淘汰了。所以,笔者抓紧补充一篇文章,告诉大家如何通过SpringBoot的方式进行SuperMap iObjects Java的开发。

众所周知,想要进行SpringBoot开发,首先就得在本地搭建Maven运行环境,以及本地Maven仓库。Maven本地仓库环境的搭建网上有铺天盖地的资料,此处就不再赘述了。由于在SuperMap官网和主要的在线仓库中均没有找到SuperMap iObjects Java的包。所以首先介绍一下如何自行将SuperMap iObjects Java安装到本地的镜像仓库中。

首先找到要安装的iObjects Java的jar包,在命令行运行如下命令,就可以将对应的jar包安装到本地仓库中:

现在去本地的Maven仓库中便可找到刚才安装的jar包文件:

 

好了,现在就可以开始使用刚才安装的iObjectsJava仓库包文件进行SpringBoot开发了。

首先, 需要创建SpringBoot工程,搭建一个基础的SpringBoot微服务环境。如果对此有疑问可自行查阅资料。搭建好SpringBoot开发环境后,需要在pom.xml中引用上面安装到本地仓库中的objects-data包进行开发,在pom.xml加入如下依赖:

<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.supermap.springboot</groupId>
	<artifactId>iobjectsdemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<supermap.version>10.1.2.19530</supermap.version>
	</properties>
	
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.4</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 引入SuperMap Objects Java的Data模块, 用于进行空间数据连接与各项操作 -->
		<dependency>
			<groupId>com.supermap.objects</groupId>
			<artifactId>objects-data</artifactId>
			<version>${supermap.version}</version>
		</dependency>
	</dependencies>

	<build>
		<!-- <pluginManagement> -->
		<plugins>
			<!-- 编译的时候使用JDK8和UTF8编码 , -->
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<!-- <version>3.0</version> -->
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>

			<!-- 编译jar包 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

然后就可以创建Controller类了:

package com.supermap.springboot.controllers;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.supermap.data.CursorType;
import com.supermap.data.Dataset;
import com.supermap.data.DatasetVector;
import com.supermap.data.Datasets;
import com.supermap.data.Datasource;
import com.supermap.data.DatasourceConnectionInfo;
import com.supermap.data.Datasources;
import com.supermap.data.FieldInfos;
import com.supermap.data.QueryParameter;
import com.supermap.data.Recordset;
import com.supermap.data.Workspace;

@RestController
public class QueryController {

	@GetMapping(path = "/query")
	public String queryData(String name) {
		StringBuilder strResult = new StringBuilder("[");

		Workspace workspace = new Workspace();
		Datasources datasources = workspace.getDatasources();
		DatasourceConnectionInfo datasourceConnectionInfo = new DatasourceConnectionInfo(
				"D:\\ProgramFiles\\SuperMap\\10i\\supermap-iobjectsjava-10.1.2-19530-86195-win-all\\SampleData\\World\\World.udbx",
				"sqlquery", "");
		Datasource datasource = datasources.open(datasourceConnectionInfo);

		// 得到数据集集合类,得到面数据集,通过数据源复制数据集
		DatasetVector datasetVector = (DatasetVector) datasource.getDatasets().get("World");
		// 构造查询参数类,设置查询条件
		QueryParameter queryParameter = new QueryParameter();
		queryParameter.setAttributeFilter("Country='" + name + "'");
		queryParameter.setCursorType(CursorType.STATIC);
		queryParameter.setHasGeometry(false);

		// 查询得到结果记录集
		Recordset recordset = datasetVector.query(queryParameter);
		FieldInfos fieldInfos = recordset.getFieldInfos();
		int count = fieldInfos.getCount();
		List<String> lstFields = new ArrayList<String>();
		for (int i = 0; i < count; i++) {
			String fieldname = fieldInfos.get(i).getName();
			lstFields.add(fieldname);
		}
		for (recordset.moveFirst(); !recordset.isEOF(); recordset.moveNext()) {
			strResult.append("{");
			for (int i = 0; i < lstFields.size(); i++) {
				String fieldName = lstFields.get(i);
				String fieldValue = recordset.getString(fieldName);
				strResult.append("\"" + fieldName + "\":\"" + fieldValue + "\",");
			}
			if (strResult.length() > 0)
				strResult.deleteCharAt(strResult.length() - 1);
			strResult.append("},");
		}
		if (strResult.length() > 0)
			strResult.deleteCharAt(strResult.length() - 1);
		strResult.append("]");
		recordset.close();
		datasource.close();
		workspace.close();
		return strResult.toString();
	}
}

此时运行工程,访问服务时一定会遇到如下错误:

这是因为没有配置iObjectsJava环境变量, 首先定义iObjectsJava的环境变量(名称随意):

将上述变量添加到Path的最前方:

 

重新打开Eclipse工程开发环境,然后再次启动项目运行。此时再去请求服务:

 

说明:上图中的结果是因为笔者使用了chrome的JSONView插件,如果未安装该插件就会以文本的方式输出,但无妨。 

OK。此时开发工作基本结束了。下面还有一个工作:如何实现工程打包及绿色部署。

首先在开发环境中通过Maven的install命令生成可运行的jar包:

 但此时能运行是因为我在path里为其配置了SuperMap iObjects Java的环境变量。如何能像iServer一样不往path里配置iObjects Java的路径,直接拷贝后就可以启动哪?通过参考iServer的启动方式,笔者发现通过将JRE及iObjects Java的包拷贝的可执行jar包相同的路径下,

 

然后再编写一下启动脚本文件(startup.bat)即可:

set WEBAPP_ROOT=%cd%
set "JRE_HOME=%WEBAPP_ROOT%\support\jre"
set "UGO_HOME=%WEBAPP_ROOT%\support\objectsjava" 
set Path=%UGO_HOME%\bin;%UGO_HOME%\third_lib;%JRE_HOME%\bin;%Path%
java -jar iobjectsdemo-0.0.1-SNAPSHOT.jar

linux下的启动脚本(startup.sh)为:

export JRE_HOME=./support/jre
export LD_LIBRARY_PATH=./support/objectsjava/bin:$LD_LIBRARY_PATH
export PATH=./support/objectsjava/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:/support/objectsjava/bin:$JRE_HOME/lib:support/objectsjava/bin:$JRE_HOME/lib:$JRE_HOME/lib/tools.jar
java -jar iobjectsdemo-0.0.1-SNAPSHOT.jar &

OK,将其拷贝到没有任何SuperMap iObjects Java的新环境下,配置好许可后,双击(或在linux下运行sh命令),即可成功启动:

 这样,就可以让SuperMap iObjects Java搭乘SpringCloud+SpringBoot+Docker的东风实现弹性伸缩部署了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值