2013-03-27 85 views
0

在此刻,在我的測試EJB project,我有以下Stateless豆:遇到的NoClassDefFoundError使用Amazon AWS SDK

@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);,但在該行從未拋出的錯誤。

我會非常感激,如果你能告訴我怎麼解決這個問題:(。

回答

0

爲了解決這個問題,我不得不打包EJB ProjectEAR Project內,只有當我部署EAR Project而不是部署EJB Project然後直接將庫裝入正確。

我還沒有發現這個問題的原因。我會很感激,如果有人能夠給我一個解釋如果可能的話:)