Сервер 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}
не работает должным образом.