Портлет Liferay MVC java.lang.ClassNotFoundException

Мой портал Liferay 7 ga4 работает на wildfly 10. Я создал и развернул портлет Liferay MVC. Я пытаюсь подключиться к базе данных MySql, но получаю эту ошибку: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Я импортировал mysql-connector-java-5.1.42-bin.jar (щелкните правой кнопкой мыши по проекту> Путь сборки> Настроить путь сборки> Добавить JAR. Он попал в раздел «Библиотеки, на которые ссылаются».

введите здесь описание изображения

А вот код view.jsp

try{
    String connectionURL = "jdbc:mysql://localhost/employees";

    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    connection = DriverManager.getConnection(connectionURL, "root", "");
    statement = connection.createStatement();

    if(!connection.isClosed()){
        out.println("Successfully connected to MySQL server" + "<br/>");
    }

} catch(Exception ex){    

    out.println("Unable to connect to database: "+ ex);  

}   

Кто-нибудь может мне помочь? Я совершенно новичок в Liferay и Java.

Спасибо.


person Den    schedule 04.10.2017    source источник
comment
Это не похоже на дублирование, эта проблема, похоже, связана с конфигурацией gradle и средой OSGi. Не могли бы вы показать свою конфигурацию Gradle?   -  person Victor    schedule 05.10.2017


Ответы (1)


Судя по предоставленной информации, вам, вероятно, не хватает зависимости в gradle.build.

Добавлять:

// https://mvnrepository.com/artifact/mysql/mysql-connector-java
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.42'

Щелкните правой кнопкой мыши свой проект и в Gradle обновите проект Gradle.

Кроме того, имейте в виду, что если ваш портлет работает с новой структурой, основанной на OSGi, в вашей среде должен быть пакет, предлагающий вам пакеты, используемые из этого Jar. Тот, что идет с Tomcat, учитываться не будет.

Поскольку эта версия MySQL является пакетом OSGi, вы можете поместить ее в папку развертывания или просто оставить в папке модулей.

Вы также можете использовать другие версии, если хотите... https://www.e-systems.tech/web/guest/blog/-/blogs/liferay-with-mysql-5-7-изменениядрайвера


Есть 3 проблемы, связанные с этим вопросом

  1. Конфигурация среды сборки
  2. Конфигурация среды выполнения
  3. Конфигурация среды выполнения

Для исправления 1 достаточно упомянутого конфига Gradle.

Чтобы исправить 2, убедитесь, что пакет MySQL установлен, вы можете поместить его в папку развертывания или в папку osgi/modules.

Чтобы исправить 3, вам нужно объявить зависимость уровня пакета в вашем файле bnb.bnd.

3 действительно странный, потому что когда вы используете bndtools, вы обычно просите инструмент определить ваши зависимости с помощью

Импортный пакет: *

Но в этом случае зависимость создается классами, загружаемыми по имени, в строке, что вынуждает вас использовать явно объявленную зависимость

Пакет импорта: com.mysql.jdbc, *

person Victor    schedule 04.10.2017
comment
Привет, Виктор, я включил зависимость в файл build.gradle и обновил проект gradle. Я вижу файл jar mysql_connector внутри проекта и внешних зависимостей, но ошибка все та же java.lang.ClassNotFoundException: com.mysql.jdbc.Driver. - person Den; 05.10.2017
comment
Красный восклицательный знак исчез? У вас есть 2 проблемы в этом вопросе, а не только одна - person Victor; 05.10.2017
comment
Я спрашиваю, как вы должны исправить проблему во время выполнения: поместите драйвер с вашим модулем в папку развертывания. - person Victor; 05.10.2017
comment
Да, красный восклицательный знак исчез. Я также поместил драйвер (.jar) и свой модуль (.jar) в папку развертывания. Я также развернул коннектор mysql для WildFly10. - person Den; 06.10.2017
comment
идеально! но банка на вашем сервере не имеет ничего общего с этой проблемой. Теперь, когда вы исправили проблему со сборкой, ваш последний шаг — исправить среду выполнения. Поскольку вы поместили оба в папку развертывания, ваша среда должна быть готова к работе. Мне очень жаль, что вы попали в этот сложный пример при первом контакте с этим набором технологий... Поскольку OSGi необходимо знать зависимости пакетов, вам нужно объявить это в вашем bnd.bnd -> Import-Package: * Обычно это обнаруживает все ваши зависимости, но в случае с Mysql вы используете строку для загрузки класса, поэтому она не определяется автоматически. - person Victor; 06.10.2017
comment
Я обновил ответ, чтобы упростить объяснение. - person Victor; 06.10.2017
comment
После добавления Import-Package: com.mysql.jdbc, * в bnd.bnd все наконец заработало. Большое спасибо за помощь. - person Den; 08.10.2017
comment
отличный, хитрый! Не за что! - person Victor; 08.10.2017