На данный момент в моем тестовом 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

Есть несколько странностей:

  1. Самое странное, что если я скопирую всю функцию testUpload() и вставлю в ManagedBean, функция работает отлично . Я на 100% уверен, что импортировал все библиотеки в оба проекта. Однако функция testUpload() может работать только внутри WAR project , но не EJB project .
  2. Как вы можете видеть в приведенном выше коде, я попытался добавить фиктивную строку Log log = LogFactory.getLog(AmazonS3Client.class);, но в этой строке никогда не возникала ошибка.

Буду чрезвычайно признателен, если вы покажете мне, как решить эту проблему :(.

0
Mr.J4mes 27 Мар 2013 в 20:38

1 ответ

Лучший ответ

Чтобы решить эту проблему, мне пришлось упаковать EJB Project внутри EAR Project. Только когда я развертываю EAR Project вместо непосредственного развертывания EJB Project, библиотеки загружаются правильно.

Я до сих пор не выяснил причину этой проблемы. Я был бы очень признателен, если бы кто-нибудь мог дать мне объяснение, если это возможно :)

0
Mr.J4mes 30 Мар 2013 в 10:17