0

我将 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}不起作用。

4

2 回答 2

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"/>
于 2021-09-24T21:15:57.827 回答
0

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

花了很长时间后,我发现 liberty 服务器提供了 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>

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

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

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

于 2021-09-24T21:08:19.170 回答