【已解决】ip2region解析ip获取地区位置 在linux部署出现java文件操作报错:java.io.FileNotFoundException

1、依赖

java 复制代码
        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>2.7.0</version>
        </dependency>

2.加入ip2region.xdb文件

ip2Region下载地址

3.加入到项目里面去

java 复制代码
把 ip2region.xdb 文件放到 resources 文件夹里面的去

在Maven里面添加依赖,防止把这个xdb文件编译:

java 复制代码
<plugin>
  <artifactId>maven-resources-plugin</artifactId>
   <configuration>
    <nonFilteredFileExtensions>
         <nonFilteredFileExtension>xdb</nonFilteredFileExtension>
       </nonFilteredFileExtensions>
     </configuration>
</plugin>

4.工具类

java 复制代码
	/**
	 * 通过ip 获取ip所在地址
	 * @param ip
	 * @return
	 */
	public static String getIpAddress(String ip){
		if ("127.0.0.1".equals(ip) || ip.startsWith("192.168")) {
			return "局域网 ip";
		}
		//双重校验锁方式加载对象实例(懒汉式)
		if (searcher == null) {
			synchronized (HttpServletRequestUtils.class) {
				if (searcher == null) {
					try {
						Resource resource = new ClassPathResource("ip2region.xdb");
						HttpServletRequestUtils httpServletRequestUtils = new HttpServletRequestUtils();
						String filePath = httpServletRequestUtils.getClass().getClassLoader().getResource("ip2region.xdb").getFile();
						File file= new File(filePath);
						log.info("文件路径:{}是否存在:{}:", filePath, file.exists());
						// 通过流将文件复制到file中
						FileUtils.writeFile(resource.getInputStream(), filePath);
						
						//下面直接获取可能会导致 java.io.FileNotFoundException 异常
//						File file = ResourceUtils.getFile("classpath:ipdb/ip2region.xdb");
						String dbPath = file.getPath();
						searcher = Searcher.newWithFileOnly(dbPath);
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
		String region = null;
		String errorMessage = null;
		try {
			region = searcher.search(ip);
		} catch (Exception e) {
			errorMessage = e.getMessage();
			if (errorMessage != null && errorMessage.length() > 256) {
				errorMessage = errorMessage.substring(0,256);
			}
			e.printStackTrace();
		}
		// 输出 region
		return region;
	}
	/*
	 * 读取返回结果
	 */
	private static String read(InputStream is) throws IOException {
		StringBuffer sb = new StringBuffer();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String line = null;
		while ((line = br.readLine()) != null) {
			line = new String(line.getBytes(), "utf-8");
			sb.append(line);
		}
		br.close();
		return sb.toString();
	}

5. 注意事项:

1.部署到线上之后:出现java文件操作报错:java.io.FileNotFoundException

java 复制代码
java.io.FileNotFoundException: class path resource [ip2region.xdb] 
cannot be resolved to absolute file path because it does not reside
 in the file system: 
相关推荐
daidaidaiyu30 分钟前
一文学习 工作流开发 BPMN、 Flowable
java
SuniaWang2 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
平行云PVT2 小时前
数字孪生信创云渲染技术解析:从混合信创到全国产化架构
linux·unity·云原生·ue5·图形渲染·webgl·gpu算力
sheji34162 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
m0_726965982 小时前
面面面,面面(1)
java·开发语言
xdscode2 小时前
Linux云服务器安装openclaw,并对接飞书通道
linux·服务器·飞书·openclaw
Percep_gan3 小时前
Linux中安装Redis,很详细
linux·运维·redis
xuhaoyu_cpp_java3 小时前
过滤器与监听器学习
java·经验分享·笔记·学习
2401_877274243 小时前
从匿名管道到 Master-Slave 进程池:Linux 进程间通信深度实践
linux·服务器·c++
程序员小假3 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端