Scala NoSuchMethodException in MaxMind GeoIp 依赖 jackson-databind 使用 mvn shade 构建时的异常
在本文中,我们将介绍使用Scala开发时遇到的NoSuchMethodException异常,以及如何解决这个问题。
阅读更多:Scala 教程
问题背景
在Scala项目开发过程中,我们常常会使用MaxMind GeoIp库来进行IP地址的定位和地理信息的获取。在使用MaxMind GeoIp时,我们可能会遇到NoSuchMethodException异常。
异常的详细信息通常会包含类似以下的错误提示:
java.lang.NoSuchMethodException: com.fasterxml.jackson.databind.ObjectWriter.forType(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/ObjectWriter;
这个异常的出现与使用mvn shade命令构建项目时所依赖的jackson-databind库版本有关。
解决方法
要解决这个异常,我们需要确保在使用mvn shade命令构建项目时,排除掉与MaxMind GeoIp所依赖的jackson-databind库版本不兼容的部分。
首先,我们需要在项目的pom.xml文件中声明shade插件的依赖:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
</dependency>
接下来,在pom.xml文件中配置shade插件,用于构建项目时对jackson-databind库进行排除:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>com.fasterxml.jackson.core:*</artifact>
<excludes>
<exclude>com/fasterxml/jackson/databind/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置完成后,使用mvn shade命令构建项目时,就会自动排除掉与MaxMind GeoIp所依赖的jackson-databind库版本不兼容的部分,从而避免NoSuchMethodException异常的出现。
示例说明
下面通过一个简单的示例来说明如何使用mvn shade命令构建项目,并解决NoSuchMethodException异常。
首先,创建一个名为”scala-project”的Scala项目,并在项目根目录下的pom.xml文件中添加依赖:
<dependencies>
<!-- MaxMind GeoIp依赖 -->
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.14.0</version>
</dependency>
<!-- jackson-databind依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
然后,编写一个Scala类来使用MaxMind GeoIp库进行IP地址定位和地理信息获取:
import com.maxmind.geoip2.DatabaseReader
import java.io.File
object GeoIpDemo extends App {
val database = new File("path/to/GeoLite2-City.mmdb")
val reader = new DatabaseReader.Builder(database).build()
val ipAddress = "8.8.8.8"
val response = reader.city(ipAddress)
val countryName = response.getCountry.getName
val cityName = response.getCity.getName
println(s"IP地址 ipAddress 定位结果:countryName, $cityName")
}
接下来,打开终端,进入项目根目录,执行以下命令构建项目:
mvn shade:shade
执行完成后,会在项目的target目录下生成一个名为”scala-project-1.0-SNAPSHOT-shaded.jar”的可执行jar包。
最后,我们可以通过如下命令运行生成的jar包,并观察到运行结果没有出现NoSuchMethodException异常:
java -jar scala-project-1.0-SNAPSHOT-shaded.jar
总结
本文介绍了在使用Scala开发过程中可能遇到的NoSuchMethodException异常,并给出了解决方案。通过使用mvn shade命令构建项目时,排除与MaxMind GeoIp所依赖的jackson-databind库版本不兼容的部分,我们可以避免这个异常的出现。
希望本文对你在使用Scala开发中遇到NoSuchMethodException异常问题有所帮助!
极客笔记