ip2region使用中找不到资源的解决方案

通过类路径加载资源

  • ip2region文件位置:
    resource/ip2region/ip2region.xdb
  • pom信息
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lizz</groupId>
    <artifactId>read-resource</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>read-resource</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <ip2region.version>2.6.5</ip2region.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>${ip2region.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  • 主要方法:

import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author lizz
 * @create 2022-08-22 20:38
 */
public class IPUtils {
    public static String getRegion(String ip){
        // 1、创建 searcher 对象
        String dbPath = getDbPath();
        if(StringUtils.isEmpty(ip)){
            return null;
        }
        Searcher searcher = null;
        try {
            searcher = Searcher.newWithFileOnly(dbPath);
            // 2、查询
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
            return region;
        } catch (Exception e) {
            System.out.printf("failed to create searcher with `%s`: %s\n", dbPath, e);
            System.out.printf("failed to search(%s): %s\n", ip, e);
            return null;
        }finally {
            // 3、关闭资源
            try {
                searcher.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static String getDbPath(){
        try {
            String dbPath = IPUtils.class.getResource("/ip2region/ip2region.xdb").getPath();
            File file = new File(dbPath);
            if (!file.exists()) {
                String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
                dbPath = tmpDir + File.separator + "ip2region.xdb";
                file = new File(dbPath);
                if (!file.exists() || (System.currentTimeMillis() - file.lastModified() > 86400000L)) {
                    try {
                        InputStream inputStream = new ClassPathResource("ip2region/ip2region.xdb").getInputStream();
                        IOUtils.copy(inputStream, new FileOutputStream(file));
                    } catch (IOException exception) {
                        exception.printStackTrace();
                    }
                }
            }
            return file.getPath();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

  • 测试方法:

import com.lizz.readresource.utils.IPUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ReadResourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ReadResourceApplication.class, args);
        String[] ips = {"112.10.180.96","127.0.0.1","168.63.123.39","185.7.214.117"};
        for (String ip : ips) {
            IPUtils.getRegion(ip);
        }

    }

}

直接将资源放到jar包目录

  • 直接使用绝对路径读取region库

ip2region源码地址

ip2region

上一篇 下一篇
评论
说点什么吧?

发表评论

取消回复