Сервер JNDI Liberty - не работает при использовании ${server.config.dir}

Я использую jdk 11 с Eclipse 2021 и WAS Liberty 21.0.0.4. У меня также есть OpenLiberty 21.0.0.4, и там возникает такая же проблема.

У меня есть код ConnectionFactory, который выглядит так

      public class ConnectionFactory {
    private static DataSource ds = null;
    ...
    public static Connection getDb2Connection() {
        Connection conn = null;
        try {
            Context initCtx = new InitialContext();
            ds = (DataSource) initCtx.lookup("jdbc/db2DataSource");  //NamingException is thrown here
            conn = ds.getConnection();
        } catch (NamingException ex) {
            System.out.println(ex);
        }
        return conn;
    }
}

Исключение, которое я получаю, это

      javax.naming.NamingException: CWWKN0008E: An object could not be obtained for name jdbc/db2DataSource

Ниже я предоставил свое решение, которое не должно использовать переменную Liberty. server.config.dirа скорее жестко закодируйте путь, как описано в моем ответе ниже. Это не идеальное решение, и я надеюсь, что кто-нибудь сможет объяснить, почему разрешение переменной Liberty с помощью ${server.config.dir} не работает.

2 ответа

В своем ответе вы написали, что работает следующее:

        <fileset dir="C:\Users\ME\dev\wlp-javaee8-21.0.0.4\wlp\usr\servers\MyServer\drivers\db2" includes="*.jar"/>

Но это не работает,

        <fileset dir="${server.config.dir}/resources/drivers/db2" includes="*.jar"/>

Это говорит о том, что у вас нет resources папка в server.config.dir, и нужно просто делать,

        <fileset dir="${server.config.dir}/drivers/db2" includes="*.jar"/>

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

Потратив некоторое время, я обнаружил, что сервер liberty предоставляет различные варианты. server.config.dir(см. https://www.ibm.com/docs/en/was-liberty/core?topic=liberty-directory-locations-properties) является причиной этой ошибки.

Ниже показано, как устанавливается мой Liberty server.xml.

Я не помещаю жестко запрограммированные значения в server.xml, но помещаю их в файл server.env следующим образом: Вышеуказанные переменные жестко запрограммированы внутри server.env, например:

      port=xxx
server=xxx
database=xxx
path=xxx
schema=xxx
user=xxx
password=xxx
type=4

, а затем в моем server.xml я ссылаюсь на эти переменные, используя нотацию ${var-name}, как здесь, чтобы установить свое имя JNDI для источника данных:

      <dataSource jndiName="jdbc/db2DataSource">
  <jdbcDriver libraryRef="DB2Library" />
  <connectionManager maxPoolSize="1" minPoolSize="1" />
  <properties.db2.jcc 
    serverName="${server}" 
    portNumber="${port}"   
    currentFunctionPath="${path}"
    currentSchema="${schema}" 
    databaseName="${database}" 
    user="${user}"
    password="${password}"
    driverType="${type}"" />
</dataSource>

Все в порядке, однако в приведенном выше источнике данных у меня есть libraryRef="DB2Library" и моя библиотека DB2Library устанавливается как:

      <library id="DB2Library">
  <fileset dir="C:\Users\ME\dev\wlp-javaee8-21.0.0.4\wlp\usr\servers\MyServer\resources\drivers\db2" includes="*.jar"/>
    <!-- <fileset dir="${server.config.dir}/resources/drivers/db2" includes="*.jar"/> -->
    <!-- <fileset dir="${server.config.dir}\resources\drivers\db2" includes="*.jar"/> -->
</library>

Обратите внимание на 2 закомментированные строки, в которых используется. Они одинаковы, за исключением того, что в одном используется косая черта, а в другом - обратная косая черта. Оба они вызовут это исключение NamingException.

Строка с жестко заданным путем будет работать нормально.

Итак, похоже, что разрешение переменной Liberty ${server.config.dir} не работает должным образом.

Другие вопросы по тегам