【问题标题】:MaxMind GeoIP2 (version 2.7.0) not usable in GAEMaxMind GeoIP2(2.7.0 版)在 GAE 中不可用
【发布时间】:2016-04-28 09:55:58
【问题描述】:

我正在尝试在 Google App Engine 上使用 MaxMind GeoIP2。在本地它可以工作,但是当我在 GAE 上部署它时,由于类受限而出现错误

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)

是否有任何“技巧”,例如使用特定版本的 GeoIP2,不会使用此错误?我通过 gradle 使用 2.7.0 版本

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

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

【问题讨论】:

标签: java google-app-engine maxmind


【解决方案1】:

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

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

【讨论】:

  • 有趣,但这意味着我的服务器将分配所有内存来缓存所有内容,不是吗?在这种情况下,我担心我根本负担不起,因为我使用的是小实例,而且消耗这么多内存是不明智的。
  • 是的,没错,但对于 GeoLite2 Country 数据库,这相当于 2.3 MB。
【解决方案2】:

GAE 在您的应用的请求标头中提供此信息:

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

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

【讨论】:

  • 尽可能简单,这是在GAE上使用位置识别的最佳解决方案
【解决方案3】:

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

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

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

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

【讨论】:

  • 是的,谢谢,我试着走这条路,但是数据库的准确性呢?不幸的是,我的结果很糟糕,就像欧洲的一半似乎在中国一样! :(您是否尝试过验证准确性?
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多