Как использовать MySQL в приложении OSGi с Maven? - PullRequest
0 голосов
/ 21 января 2019

Как использовать MySQL в приложении OSGi с Maven и Apache Felix?

Я добавил это в мой pom.xml файл:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
</dependencies>

А это для Активатора (для тестирования):

DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "user", "");

Но когда я запускаю приложение через Apache Felix, я получаю эту ошибку при загрузке пакета:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/dbname

В чем проблема и как я могу ее решить?


EDIT

Хотя я где-то читал, что, поскольку в какой-то версии Java драйвер не нужно явно регистрировать (я использую Java 11), я попытался добавить этот код прямо перед вызовом .getConnection():

Class.forName("com.mysql.jdbc.Driver");

Однако, это только генерирует другую ошибку:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver not found

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вам необходимо

  1. Сначала загрузите jar OSGI коннектора MySQL, эта зависимость от pom работать не будет. В jar MySQL Osgi будут экспортированы пакеты в файле манифеста.
  2. Затемустановите его как пакет в системной консоли Apache Felix.

  3. Затем настройте соединение в system / console / configMgr под источниками данных

Затем используйтекод ниже, чтобы прочитать настроенный источник данных.

String filter = "(&(objectclass=javax.sql.DataSource)(datasource.name="+configurationId+"))";
                    ServiceReference[] refs = bundleContext.getAllServiceReferences(null, filter);
                    if(refs != null && refs.length == 1) {
                        dataSource = (javax.sql.DataSource) bundleContext.getService(refs[0]);
                    }

где bundleContext будет вашим контекстом osgi (org.osgi.framework.BundleContext)

0 голосов
/ 28 января 2019

Добавить эту строку вместо загрузки драйвера через Class.forName():

new com.mysql.cj.jdbc.Driver();
0 голосов
/ 21 января 2019

Перед использованием метода getConnection (...) вам необходимо сначала загрузить драйвер в память. Используйте следующую команду для загрузки класса:

Class.forName("com.mysql.jdbc.Driver")

Это автоматически регистрирует драйвер mysql в DriverManager. Тогда вы можете использовать:

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "user", "");

для получения экземпляра соединения.

...