簡體   English   中英

使用Amazon AWS開發工具包時遇到NoClassDefFoundError

[英]Encountered NoClassDefFoundError when using Amazon AWS SDK

目前,在我的測試EJB project ,我具有以下Stateless bean:

@WebService(serviceName = "TestService")
@Stateless()
public class TestService {

    @WebMethod(operationName = "testUpload")
    public void testUpload() {
        // DUMMY LINE
        Log log = LogFactory.getLog(AmazonS3Client.class);
        // END DUMMY LINE

        File file = new File("path_to_test_file");
        AWSCredentials credentials = new BasicAWSCredentials(AMAZON_KEY_ID, AMAZON_SECRET_KEY);
        AmazonS3 conn = new AmazonS3Client(credentials);
        conn.setEndpoint("https://s3-ap-southeast-1.amazonaws.com");
        PutObjectRequest por = new PutObjectRequest(AMAZON_BUCKET_NAME, "test.txt", file);
        conn.putObject(por);
    }

}

在我的測試WAR project ,我具有以下ManagedBean

@Named(value = "mrBean")
@RequestScoped
public class MrBean {
    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/TestService/TestService.wsdl")
    private TestService_Service service;
    private TestService port;

    @PostConstruct
    public void test() {
        port = service.getTestServicePort();
        port.testUpload();
    }
}

在部署EJB project並運行test.xhtml頁面時,總是在以下行遇到錯誤:

AmazonS3 conn = new AmazonS3Client(credentials);

一開始,錯誤看起來像這樣:

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.amazonaws.services.s3.AmazonS3Client.<clinit>(AmazonS3Client.java:193)
...
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

經過幾次試運行后,錯誤變為:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.services.s3.AmazonS3Client

有一些奇怪的事情:

  1. 最奇怪的是,如果我復制整個testUpload()函數並粘貼到ManagedBean ,則該函數可以正常工作 我100%確定我已經導入了兩個項目中的所有庫。 但是,功能testUpload()只能在WAR project ,而不能在EJB project
  2. 如您在上面的代碼中所看到的,我嘗試添加一條虛擬行Log log = LogFactory.getLog(AmazonS3Client.class); 但是錯誤從來沒有拋出過。

如果您能告訴我如何解決這個問題,我將非常感激:(。

為了解決這個問題,我不得不將EJB Project打包在EAR Project 僅當我部署EAR Project而不是直接部署EJB Project ,庫才被正確加載。

我仍然沒有找到這個問題的原因。 如果有人可以給我一個解釋,我將不勝感激:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM