【问题标题】:JNDI Liberty Server - Not Working if using ${server.config.dir}JNDI Liberty 服务器 - 如果使用 ${server.config.dir} 则不工作
【发布时间】:2021-09-24 20:52:00
【问题描述】:

我将 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,而是硬编码路径,如下面的回答中所述。这不是完美的解决方案,我希望有人能够解释为什么使用 ${server.config.dir} 解析 Liberty 变量不起作用。

【问题讨论】:

  • 您能分享一下您的服务器配置(server.xml 等)的关键部分吗?

标签: java-11 websphere-liberty open-liberty eclipse-2021-09


【解决方案1】:

在您的回答中,您发布了以下内容,

  <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"/>

这表明您在server.config.dir 中没有resources 文件夹,应该只是这样做,

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

【讨论】:

  • 当我在下面发布我的解决方案时,这只是我的错误。资源/驱动程序/db2 存在并正确设置。我只是错误地把它贴在这里。我在下面更新了我的答案以获得正确的路径,问题仍然存在。
  • 共享库文件集的${server.config.dir} 变量的使用可以在 Open Liberty 自己的自动化测试中找到。例如,github.com/OpenLiberty/open-liberty/blob/integration/dev/… 似乎工作正常。如果在两次/三次检查您自己的配置/设置之后,您发现变量解析不起作用的情况,您可以为其打开一个案例或问题:github.com/OpenLiberty/open-liberty/issues/new/choose
  • 谢谢。我们很少有人注意到非硬编码路径并不总是有效。这里的重点是“总是”。我想知道我们在从 Eclipse 构建和部署我们的 ear 文件到 Liberty 服务器的方式是否可能出错。
【解决方案2】:

我创建这个问题是为了希望得到答案,但我找到了不是我希望的解决方案,但我没有更好的解决方案。

经过一段时间后,我发现liberty server提供的varialbe 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>

请注意使用${server.config.dir} 的两行注释掉的行。除了一个使用正斜杠和另一个反斜杠之外,它们是相同的。它们都会导致这个 NamingException。

带有硬编码路径的行可以正常工作。

因此,变量 ${server.config.dir} 的 Liberty 解析似乎无法正常工作。

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多