MaxMind GeoIP2(版本 2.7.0)在 GAE 中不可用

MaxMind GeoIP2 (version 2.7.0) not usable in GAE

我正在尝试在 Google App Engine 上使用 MaxMind GeoIP2。在本地它可以工作,但是当我在 GAE 上部署它时,由于 class

受限而出现错误
java.lang.NoClassDefFoundError: java.nio.MappedByteBuffer is a restricted class. Please see the Google App Engine developer's guide for more details.
    at java.nio.channels.FileChannel.map(FileChannel.java)
    at com.maxmind.db.BufferHolder.<init>(BufferHolder.java:31)
    at com.maxmind.db.Reader.<init>(Reader.java:116)
    at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:39)
    at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:27)
    at com.maxmind.geoip2.DatabaseReader$Builder.build(DatabaseReader.java:133)

有没有"trick",比如使用特定版本的 GeoIP2,不会出现这个错误?我通过 gradle

使用 2.7.0 版
compile group: "com.maxmind.geoip2", name: "geoip2", version: "2.7.0"

有人试过旧版 GeoIP 吗?运气好吗?我的唯一目标是了解如何使用这个库,如果可能的话,或者找到一个提供相同功能的替代库(从 IP 获取国家/地区的 ISO 代码)

如果 GeoIP2 不能部署在 GAE 上,我发现 GeoIP Legacy 可以,特别是我在 gradle:

中设置
compile group: "com.maxmind.geoip", name: "geoip-api", version: "1.3.1"

有关联的GeoIP.dat文件可以下载here

这个版本在GAE上运行没有任何问题

您应该可以在 GAE 上使用 GeoIP2 中的内存模式:

DatabaseReader reader = new DatabaseReader.Builder(dbFile)
         .fileMode(Reader.FileMode.MEMORY).build();

GAE 在请求 header 中向您的应用提供此信息:

String visitorCountry = request.getHeader("X-AppEngine-Country");

请注意,它在开发服务器上可能是空的,但在部署时会填充。