使用AWS SDK for Java运行程序时出现NoClassDefFoundError错误

13

我正在尝试使用AWS SDK for Java附带的DynamoDB示例。我在Eclipse中完成,并将aws-java-sdk-1.3.2.jar文件添加到项目的构建路径中。编译当然没问题,但是我遇到了一个名为NoClassDefFoundError的运行时异常。

我知道这意味着该类在编译时存在,但在运行时无法找到。

我尝试将jar文件添加到环境变量中,但没有帮助。

我还检查了其他项目中是否存在使用其他外部jar文件的问题。

在Windows和Linux上都有同样的问题。请问有人能帮忙吗?

谢谢,Ben。

堆栈跟踪:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.<clinit>(AmazonDynamoDBClient.java:62)
    at AmazonDynamoDBSample.init(AmazonDynamoDBSample.java:62)
    at AmazonDynamoDBSample.main(AmazonDynamoDBSample.java:67)

请发布您的堆栈跟踪(stack trace)。 - Lai Xin Chu
1
你是否已经添加了Apache Commons库的JAR文件?它可以在这里找到:http://commons.apache.org/logging/download_logging.cgi - Lai Xin Chu
1
是的,还有编解码器和HTTP客户端。所有这些都添加到构建路径中。 - Ben Danon
你尝试重新构建项目了吗?同时检查一下lib文件夹,看看是否能在那里找到jar文件。 - Lai Xin Chu
尝试重新构建。找到哪个jar文件了吗? - Ben Danon
Apache Commons Jar,因为您遇到了NoClassDefFoundError错误。尝试将Apache Commons Jar放入lib文件夹中? - Lai Xin Chu
2个回答

16
aws-java-sdk-1.3.2 文件夹中,您会找到另一个名为 "third-party" 的文件夹。Amazon SDK 使用的所有第三方文件都在该文件夹中,包括 Apache Common Logging。您必须将所需的文件与 AWS SDK jar 文件一起添加到类路径中。

你能提供一下那个神奇的“第三方”网站链接吗?在jar依赖中没有这样的文件夹。 - Cherry
1
天啊...我已经困扰于这个问题太久了...第三方库...该死的... - WernerCD

2

看起来你的AWS JAR需要一些额外的JAR来实现所使用的非AWS项目(比如在你的情况下是日志记录)。

如果你下载了一个包含“lib”目录的可分发软件,那么很可能你只配置了Eclipse去使用AWS JAR而没有使用所有必需的JAR,包括AWS和可能在“lib”目录中的所有JAR。


lib文件夹中包含aws-java-sdk-1.3.2-sources.jar和aws-java-sdk-1.3.2-javadoc.jar,它们不相关,对吗?我还有一个名为third party的目录,其中包含commons-logging-1.1.1.jar,也在构建路径中... - Ben Danon
你猜对了,源代码和javadoc jar包不是你需要添加的。第三方commons-logging-1.1.1.jar文件包含了你所需的缺失类。另外,如果你想要调试AWS库,你可以将其配置为“包含源代码”,然后连接“源代码”JAR文件。 - Edwin Buck
commons-logging-1.1.1.jar已经在构建路径中了。我也手动在jar包中找到了org/apache/commons/logging/LogFactory.class。你能想到JVM找不到它的任何原因吗? - Ben Danon
很可能你的运行时路径与构建路径不同。请检查运行配置,看看是否也包括commons-logging jar文件。 - Edwin Buck
3
你是对的!构建路径应包含aws-java-sdk-1.3.2.jar,运行时路径(引导项)应包含jackson-core-asl-1.8.7.jar、httpclient-4.1.1.jar、httpcore-4.1.jar、commons-logging-1.1.1.jar和commons-codec-1.3.jar。 - Ben Danon
我经常不定期地遇到这个问题。使用Maven,我在构建路径上有所有正确的JAR包,但有时我需要显式地更新类路径,当使用许多JAR包时这是很麻烦的。在Eclipse中是否有一种自动将构建路径JAR包放入类路径的方法?(我以为它已经这样做了...) - Don Cheadle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接