Jetty mysql 连接池配置错误:javax.naming.NameNotFoundException;剩余名称 'env/jdbc/---(mysql 5.0+jetty 7.0.1)

Posted

技术标签:

【中文标题】Jetty mysql 连接池配置错误:javax.naming.NameNotFoundException;剩余名称 \'env/jdbc/---(mysql 5.0+jetty 7.0.1)【英文标题】:Jetty mysql connection-pool configuration error: javax.naming.NameNotFoundException; remaining name 'env/jdbc/---(mysql 5.0+jetty 7.0.1)Jetty mysql 连接池配置错误:javax.naming.NameNotFoundException;剩余名称 'env/jdbc/---(mysql 5.0+jetty 7.0.1) 【发布时间】:2011-01-09 01:29:38 【问题描述】:

我的配置文件

项目/WEB-INF/web.xml

<resource-ref>
    <description>ConnectionPool DataSource Reference</description>
    <res-ref-name>jdbc/mysql</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

项目/WEB-INF/jetty-env.xml:

<New id="mysql" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
<Arg>jdbc/mysql</Arg>
    <Arg>
        <New class="org.apache.commons.dbcp.BasicDataSource">
            <Set name="driverClassName">com.mysql.jdbc.Driver</Set>
            <Set name="url">jdbc:mysql://localhost:3306/db</Set>
            <Set name="username">user</Set>
            <Set name="password">pwd</Set>
            <Set name="maxActive">50</Set>
        </New>
    </Arg>
</New>

要调用的代码:

ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
con=ds.getConnection();

启动码头的脚本:

java -DOPTIONS=plus -jar start.jar

java -jar start.jar

无论哪种方式启动码头,我都收到以下错误:


javax.naming.NameNotFoundException; remaining name 'env/jdbc/mysql'
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:632)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:663)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:678)
        at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:110)
        at javax.naming.InitialContext.lookup(Unknown Source)

问题是:

这里有什么问题? 还需要其他配置吗? 以下 jar 文件的放置位置: commons-dbcp-1.2.2.jar mysql-connector-java-5.1.10-bin.jar

谢谢!

【问题讨论】:

"remaining name 'env" 似乎暗示找不到整个环境。 jetty-env.xml 完全加载了吗?也许您需要将其添加到 -DOPTIONS 或其他内容中? 【参考方案1】:

面临同样的问题。 我的 project/WEB-INF/jetty-env.xml 是:

<New id="DS" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg><Ref id="studentsApp"/></Arg>
    <Arg>jdbc/DS</Arg>
    <Arg>
        <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
            <Set name="Url">jdbc:mysql://localhost:3306/students</Set>
            <Set name="User">root</Set>
            <Set name="Password">root</Set>
        </New>
    </Arg>
</New>

并且发生了同样的错误。我试图切换 jndi 范围 - 没有用。 当我试图查看 java:comp/ 以查看可用的 jndi 条目时,它什么也不返回。使用的 jndi 列表代码:

Context t = (Context)new InitialContext().lookup("java:comp");
listContext(t, "");

private static final void listContext(Context ctx, String indent) 
    try 
        NamingEnumeration list = ctx.listBindings("");
        while (list.hasMore()) 
            Binding item = (Binding) list.next();
            String className = item.getClassName();
            String name = item.getName();
            System.out.println(indent + className + " " + name);
            Object o = item.getObject();
            if (o instanceof javax.naming.Context) 
                listContext((Context) o, indent + " ");
            
        
     catch (NamingException ex) 
        System.out.println(ex);
    

我确定 jetty-web.xml 已加载 - 我已添加:

<Call class="org.eclipse.jetty.util.log.Log" name="info"><Arg>Starting my super test application</Arg></Call>

jetty-web.xml 之上,它在服务器启动时输出。

然后,我决定从非便携式 jetty-web.xml 移动到 context.xml 文件,将其放入 $JETTY_HOME/contexts em>,将 MySQL 连接器 jar 放入 $JETTY_HOME/lib/ext 并开始工作。

如果从 jetty-web.xml 加载 JNDI 条目,Jetty 似乎有问题。

【讨论】:

我不能像这样使用上下文文件夹,否则我会。有关解决方案,请参阅上面 Sean 的评论。【参考方案2】:

注意:以下假设您使用的是 Jetty 7.2.2+(可能适用于任何 Jetty 7.0+)。

问题是您缺少一个额外的间接层。即使您已经在您的 web 应用中配置了 Jetty,您仍然需要告诉 Jetty 容器它需要在您的 web 应用中查找 jetty-env.xml。为此,请将以下内容添加到您的 jetty.xml(在 $JETTY_INSTALL_DIR/etc 下:

<Call name="setAttribute">
  <Arg>org.eclipse.jetty.webapp.configuration</Arg>
  <Arg>
      <Array type="java.lang.String">
          <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
          <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
          <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.TagLibConfiguration</Item>
      </Array>
  </Arg>
</Call>

现在 Jetty 将知道解析您创建的 jetty-env.xml。

【讨论】:

帮助我,正是我所缺少的。 Jetty8 也顺便说一句。谢谢! 嗯,我非常感谢您回答了一年前的问题,因为它对我有很大帮助,谢谢!我也在使用 Jetty 8。 我认为你没有开玩笑。我也很想得到这个答案。【参考方案3】:

这让我整天发疯。仅供参考,我正在使用 Jetty 6.1.22。第一篇文章的评论是正常的——我在 WEB-INF 中有一个文件名 jetty-env.xml,它被忽略了。我将它重命名为 jetty-web.xml 为 New 指令的第二个参数指定了数据源的全名(即 java:comp/env/jdbc/mydatasource)并且它起作用了。

【讨论】:

这也是我必须做的。我正在使用 Jetty-Hightite 7.0.1 此修复对我有用,感谢您回答较早的帖子。我必须像这样将完整路径名添加到我的声明中: java:comp/env/jdbc/DBName org.postgresql.Driverjdbc:postgresql:/ /localhost:5432/db ... 【参考方案4】:

Jetty documentation indicates a three-step process 用于使用 JNDI 资源,例如数据库。这些说明应适用于 Jetty 7 和 Jetty 8。

    编辑$JETTY_HOME/start.ini文件如下:

    修改服务器OPTIONS以包含“加号”,例如:

    OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus

    在文件底部附近,在配置文件部分中,在etc/jetty.xml 之后添加以下行:

    etc/jetty-plus.xml

【讨论】:

我遇到了同样的问题,我按照文档进行操作,最后我不得不使用完整的 jndi 路径,例如'java:comp/env/jdbc/DBName' 在我的 声明中。我在 jetty.xml 中添加了我的,一开始就保持简单。

以上是关于Jetty mysql 连接池配置错误:javax.naming.NameNotFoundException;剩余名称 'env/jdbc/---(mysql 5.0+jetty 7.0.1)的主要内容,如果未能解决你的问题,请参考以下文章

数据连接池配置错误,javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

如何配置mysql JNDI连接池

mysql 数据库连接池

java sql数据连接池的问题?

JETTY,JDK11 发邮件 javax/activation/DataSource类找不到错误

Jetty的安装和配置