导出jar文件后Hadoop抛出java.lang.VerifyError

时间:2011-01-13 22:24:51

标签: eclipse amazon-s3 hadoop jets3t

我正在改变一个hadoop地图 - 减少当前编译的工作并在没有我的更改的情况下正常运行。

作为工作的一部分,我现在将连接到S3以提供文件。

我开发了一个(非常简单的)s3Connector类,在eclipse中测试并运行它, 然后把它挂进我的减少工作。为了在hadoop中运行作业,我必须将项目导出为jar文件,然后从hadoop调用它。 jar文件似乎在没有问题的情况下编译和导出,但是当我在hadoop中运行它时,我得到了一个java.lang.VerifyError异常。

java.lang.VerifyError: (class: com/extrabux/services/S3Connector, method: 
connectToS3 signature: ()V) Incompatible argument to function

其他一些帖子提到可能存在冲突的jar版本依赖项,但在我的eclipse构建路径中,我添加了指定库的所有最新jar文件,并将它们推送到构建路径顺序的顶部。 / p>

这很简单,我可以把它分离到:

import org.jets3t.service.impl.rest.httpclient.RestS3Service;
import org.jets3t.service.security.AWSCredentials;

public class S3Connector {

protected RestS3Service s3Service;
protected AWSCredentials awsCredentials;


public S3Connector()
{
    this.awsCredentials= new AWSCredentials("my secret 1", "my secret 2");
}


public void connectToS3() throws Exception
{
    this.s3Service = new RestS3Service(this.awsCredentials);
}  

}

即使是那个简单的类也会死...同样的消息。只要我在构造函数和RestS3Service中注释掉AWS凭据,问题就会消失。基本上,我认为它是eclipse之外的某种库出口问题,但不知道如何找到它。

1 个答案:

答案 0 :(得分:4)

想出来了。在hadoop lib目录中有一个旧版本的jets3t jar

hadoop命令行脚本遍历lib目录中的所有jar,并将它们物理地添加到它构建的最终exec'ed命令行命令的类路径中。 0.6.0 jar的这个命令行类路径覆盖了我在jar文件中导出的好的0.8.0 jar。由于0.6.0版本没有RestS3Service的指定构造函数,因此抛出了java.lang.VerifyError。通过从hadoop中删除0.6.0 lib,一切都很顺利。