启动Asterisk-Java时出现Guava RateLimiter缺失错误
解决Asterisk-Java运行时找不到Guava RateLimiter的问题
问题场景
编译使用Guava的Asterisk-Java项目后,执行命令:
java -cp asterisk-java.jar org.asteriskjava.fastagi.DefaultAgiServer
运行jar包时抛出如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/util/concurrent/RateLimiter at org.asteriskjava.lock.Lockable.<init>(Lockable.java:23) at org.asteriskjava.fastagi.AbstractMappingStrategy.<init>(AbstractMappingStrategy.java:38) at org.asteriskjava.fastagi.ResourceBundleMappingStrategy.<init>(ResourceBundleMappingStrategy.java:93) at org.asteriskjava.fastagi.ResourceBundleMappingStrategy.<init>(ResourceBundleMappingStrategy.java:67) at org.asteriskjava.fastagi.ResourceBundleMappingStrategy.<init>(ResourceBundleMappingStrategy.java:57) at org.asteriskjava.fastagi.DefaultAgiServer.<init>(DefaultAgiServer.java:158) at org.asteriskjava.fastagi.DefaultAgiServer.<init>(DefaultAgiServer.java:136) at org.asteriskjava.fastagi.DefaultAgiServer.<init>(DefaultAgiServer.java:76) at org.asteriskjava.fastagi.DefaultAgiServer.main(DefaultAgiServer.java:394) Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.RateLimiter at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 9 more
当前使用的Guava依赖:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.0.1-jre</version> </dependency>
修改pom.xml中的Guava版本后,问题仍未解决。
原因分析
核心问题是运行时类路径中缺失Guava依赖:你仅在编译阶段通过pom.xml引入了Guava,但执行java -cp命令时,只指定了asterisk-java.jar,未将Guava的jar包加入类路径,导致JVM无法找到RateLimiter类。
注:Guava 32.0.1-jre确实包含RateLimiter类,版本本身不是直接原因,优先解决类路径问题。
解决方案
方案一:命令行手动添加Guava到类路径
找到本地Maven仓库中Guava jar包的路径(通常为~/.m2/repository/com/google/guava/guava/32.0.1-jre/guava-32.0.1-jre.jar),修改运行命令:
- Linux/macOS系统:
java -cp asterisk-java.jar:/path/to/guava-32.0.1-jre.jar org.asteriskjava.fastagi.DefaultAgiServer
- Windows系统(用分号分隔路径):
java -cp asterisk-java.jar;C:\path\to\guava-32.0.1-jre.jar org.asteriskjava.fastagi.DefaultAgiServer
方案二:打包包含所有依赖的可执行jar(推荐)
修改pom.xml,添加maven-assembly-plugin插件,打包时自动将所有依赖(包括Guava)合并到jar包中:
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>org.asteriskjava.fastagi.DefaultAgiServer</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录会生成带-jar-with-dependencies后缀的jar包,直接运行即可:
java -jar asterisk-java-xxx-jar-with-dependencies.jar
方案三:检查版本兼容性
若上述方法无效,确认Asterisk-Java版本对Guava的要求:查看Asterisk-Java项目的pom.xml,对齐它声明的Guava依赖版本,避免版本不兼容问题。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

