在GWT2.7中运行的Jetty中设置上下文java:comp/env

在GWT2.7中运行的Jetty中设置上下文java:comp/env,gwt,jetty,jndi,Gwt,Jetty,Jndi,/web-INF中jetty-web.xml的内容: org.eclipse.jetty.webapp.webinf配置 org.eclipse.jetty.webapp.WebXmlConfiguration org.eclipse.jetty.webapp.MetaInfConfiguration org.eclipse.jetty.webapp.FragmentConfiguration org.eclipse.jetty.plus.webapp.EnvConfiguration org

/web-INF中jetty-web.xml的内容:


org.eclipse.jetty.webapp.webinf配置
org.eclipse.jetty.webapp.WebXmlConfiguration
org.eclipse.jetty.webapp.MetaInfConfiguration
org.eclipse.jetty.webapp.FragmentConfiguration
org.eclipse.jetty.plus.webapp.EnvConfiguration
org.eclipse.jetty.plus.webapp.plus配置
org.eclipse.jetty.webapp.JettyWebXmlConfiguration
java.naming.factory.initial
java.naming.factory.url.pkgs
/WEB-INF中jetty-plus.xml的内容:


org.eclipse.jetty.webapp.FragmentConfiguration
org.eclipse.jetty.plus.webapp.EnvConfiguration
org.eclipse.jetty.plus.webapp.plus配置
这是我在Servlet的init()方法中的调用代码:

Context_initCtx=new InitialContext();
Context _envCtx=(Context)_initCtx.lookup(“java:comp/env”);
它抛出的错误:

javax.naming.NameNotFoundException;剩余名称“env”
位于org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:449)
位于org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
位于org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551)
位于org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117)
位于javax.naming.InitialContext.lookup(未知源)
我正在运行vanilla GWT 2.7,并试图在服务器代码中使用JNDI查找。 我还将jetty-all-8.1.9.v20130131.jar和jetty-plus-8.1.9.v20130131.jar附加到项目中,因为GWT jar中缺少一些上下文和JNDI类。我尝试在GWT中验证jetty的版本,得到了以下结果:

Server服务器=新服务器(7070);
System.out.println(server.getVersion());
8.y.z-快照
我看到了一个可以通过其他方式配置JNDI的解决方案,但因为我在GWT中运行,所以我只能使用jetty-web.xml和jetty-plus.xml文件

调试servlet时,我将获取以下内容的上下文:

Context\u envCtx=(Context)\u initCtx.lookup(“java:comp”);
但不是为了:

Context\u envCtx=(Context)\u initCtx.lookup(“java:comp/env”);
Stacktrace在上面

我真的被困在这里了。有码头大师吗


编辑1: 添加了jetty-env.xml:


jdbc/DSTest
jdbc:hsqldb:hsql://localhost
sa
下面是我的web.xml:


主数据库
jdbc/DSTest
javax.sql.DataSource
容器
仍然_envCtx为空,下面有一个例外_initCtx.lookup(“java:comp”)返回org.eclipse.jetty.jndi.NamingContext实例

Context_initCtx=new InitialContext();
Context _envCtx=(Context)_initCtx.lookup(“java:comp/env”);
导致

javax.naming.NameNotFoundException;剩余名称“env”

编辑2: 我一定是错过了一些别的东西(基本的)。。。。??!? 我将jetty-env.xml中的那一行更改为:

<Arg><Ref refid="portal"/>jdbc/DSTest</Arg>
jdbc/DSTest
以及doctype:

<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

我找不到更适合v8.X的.dtd
仍然存在相同的问题。

这不是一种受支持的用法,但应该可以:

但是,您必须使用与Jetty dependencies完全相同的版本,并且

问题是,
java:comp/env
直到:

  • 创建了一个引用(在webapp的特定
    jetty env.xml
    中,或在顶级服务器xml文件中)
  • 该引用绑定到webapp实例(而不是服务器实例)。请参见
    org.eclipse.jetty.plus.jndi.Resource
    声明中的第一个参数
  • 您的WEB应用程序的
    WEB-INF/WEB.xml
    声明了一个指向此资源的
Jetty只是遵循servlet规范

对编辑的响应#1

,升级至9号码头

这些说明适用于9号码头

有两件事。。。(就像上面原始答案中的链接一样)

  • 您的
    DOCTYPE
    错误。更新它

  • 您没有将引用绑定到webapp,事实上,您的XML代码段被配置为绑定到JVM上下文。(参数#1未指定/空)

jdbc/DSTest
jdbc:hsqldb:hsql://localhost
sa
什么对我有效(假设您没有使用SuperDevMode):

  • 运行DevMode时,将
    -Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
    添加到JVM参数中。(对于gwt maven插件,在
    extraJvmArgs
    中)

  • 将Jetty Plus和JNDI的依赖项添加到POM中:

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    

  • 就这样。

    谢谢托马斯的提问和回答。我有一个非常相似的情况。很难得到正确的配置组合,但我终于让它工作了。我想我最好把我的发现记录在这里

    我这样做是为了设置
    GWT2.6
    ,它使用
    Jetty 8.1.12v20130726
    。我的 目标是为
    DBCP2
    连接池设置
    JNDI
    。我在跑步
    GWT
    in
    Eclipse
    in
    DevMode

    WEB-INF/jetty WEB.xml

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    
    我使用的是
    JVM
    范围,但在
    WebAppContext

    还请注意,所使用的名称是
    java:comp/env/jdbc/datalakeDbcp2
    (即前缀为
    java:comp/env/

    无需更改WebAppClassLoaderExtension——只需使用它即可 作为原始代码:

    private class WebAppClassLoaderExtension extends WebAppClassLoader {
    
      private static final String META_INF_SERVICES = "META-INF/services/";
    
      public WebAppClassLoaderExtension() throws IOException {
        super(bootStrapOnlyClassLoader, WebAppContextWithReload.this);
      }
    
    pom.xml

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    
    WEB-INF/WEB.xml

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    
    可能是因为我在我的
    jettyweb.xml
    中使用了
    VM
    范围,所以我这样做了 不需要改变我的想法<
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>8.1.12.v20130726</version>
        <scope>provided</scope>
    </dependency>
    
    -Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory 
    
    try {
       InitialContext ic = new InitialContext();
       DataSource ds 
           = (DataSource) ic.lookup("java:/comp/env/jdbc/datalakeDbcp2");
       conn = ds.getConnection();
    } catch (NamingException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       throw new RuntimeException(e);
    };