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

Zak*_*Zak 5 eclipse hadoop amazon-s3 jets3t

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

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

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

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

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

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

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);
}  

}
Run Code Online (Sandbox Code Playgroud)

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

Zak*_*Zak 4

想通了这一点。hadoop lib 目录中有一个旧版本的 jets3t jar

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