На данный момент в моем тестовом EJB project
у меня есть следующий bean-компонент Stateless
:
@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);
, но в этой строке никогда не возникала ошибка.
Буду чрезвычайно признателен, если вы покажете мне, как решить эту проблему :(.
1 ответ
Чтобы решить эту проблему, мне пришлось упаковать EJB Project
внутри EAR Project
. Только когда я развертываю EAR Project
вместо непосредственного развертывания EJB Project
, библиотеки загружаются правильно.
Я до сих пор не выяснил причину этой проблемы. Я был бы очень признателен, если бы кто-нибудь мог дать мне объяснение, если это возможно :)
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.