You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:53:33