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
有一些奇怪的事情:
- 最奇怪的是,如果我將整個
testUpload()
功能複製並粘貼到ManagedBean
中,功能完美地工作。我敢肯定,100%,我進口的這兩個項目的所有庫。但是,功能testUpload()
只能在WAR project
,而不是EJB project
內工作。 - 正如你可以在上面的代碼中看到,我試圖添加一個虛擬線
Log log = LogFactory.getLog(AmazonS3Client.class);
,但在該行從未拋出的錯誤。
我會非常感激,如果你能告訴我怎麼解決這個問題:(。