/ WEB-INF中的jetty-web.xml的内容:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Array id="plusConfig" 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> <!-- add for jndi -->
<Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item> <!-- add for jndi -->
<Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
</Array>
<Call class="java.lang.System" name="setProperty">
<Arg>java.naming.factory.initial</Arg>
<Arg><Property name="java.naming.factory.initial" default="org.eclipse.jetty.jndi.InitialContextFactory"/></Arg>
</Call>
<Call class="java.lang.System" name="setProperty">
<Arg>java.naming.factory.url.pkgs</Arg>
<Arg><Property name="java.naming.factory.url.pkgs" default="org.eclipse.jetty.jndi"/></Arg>
</Call>
</Configure>
/ WEB-INF中的jetty-plus.xml的内容:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Add plus Configuring classes to all webapps for this Server -->
<!-- =========================================================== -->
<Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
<Arg><Ref refid="Server" /></Arg>
<Call name="addAfter">
<Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>
<Arg>
<Array type="String">
<Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
<Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
</Array>
</Arg>
</Call>
</Call>
</Configure>
这是我在Servlet的init()方法中的调用代码:
Context _initCtx = new InitialContext();
Context _envCtx = (Context) _initCtx.lookup("java:comp/env");
抛出错误:
javax.naming.NameNotFoundException; remaining name 'env'
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:449)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551)
at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117)
at javax.naming.InitialContext.lookup(Unknown Source)
我正在运行vanilla GWT 2.7并且我试图在我的服务器代码中使用JNDI查找。 我还将jetty-all-8.1.9.v20130131.jar和jetty-plus-8.1.9.v20130131.jar附加到项目中,因为GWT jar中缺少一些Context和JNDI类。我试图在GWT中验证jetty的版本,我得到了这个:
Server server = new Server(7070);
System.out.println(server.getVersion());
8.y.z-SNAPSHOT
我看到了可以在其他方式配置JNDI的解决方案,但是由于我在GWT中运行,我只能使用jetty-web.xml和jetty-plus.xml文件。
在调试servlet时,我得到了上下文:
Context _envCtx = (Context) _initCtx.lookup("java:comp");
但不是为了:
Context _envCtx = (Context) _initCtx.lookup("java:comp/env");
Stacktrace就在上面。
我真的被困在这里了。那里有任何码头大师?
添加了jetty-env.xml:
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id='portal' class="org.eclipse.jetty.webapp.WebAppContext">
<New id="DStest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="org.hsqldb.jdbcDriver">
<Set name="Url">jdbc:hsqldb:hsql://localhost</Set>
<Set name="User">sa</Set>
<Set name="Password"></Set>
</New>
</Arg>
</New>
</Configure>
这是我的web.xml:
<resource-ref>
<description>Primary database</description>
<res-ref-name>jdbc/DSTest</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
仍然_envCtx为null,下面有例外。 _initCtx.lookup(&#34; java:comp&#34;)确实返回org.eclipse.jetty.jndi.NamingContext实例。
Context _initCtx = new InitialContext();
Context _envCtx = (Context) _initCtx.lookup("java:comp/env");
结果
javax.naming.NameNotFoundException; remaining name 'env'
我必须遗漏别的东西(基本的).... ??!? 我将jetty-env.xml中的那一行更改为:
<Arg><Ref refid="portal"/>jdbc/DSTest</Arg>
doctype:
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
我找不到更适合v8.X的.dtd 还是同样的问题。
答案 0 :(得分:5)
什么对我有用(假设您没有使用SuperDevMode):
运行DevMode时,将-Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
添加到JVM参数。 (在extraJvmArgs
中为gwt-maven-plugin)
将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>
在jetty-web.xml
中配置JNDI条目:
<?xml version="1.0"?>
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<New id="DataSource" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/XYZ</Arg>
<Arg>
<New class="org.postgresql.ds.PGSimpleDataSource">
<Set name="user">X</Set>
<Set name="password">Y</Set>
<Set name="databaseName">Z</Set>
<Set name="serverName">X</Set>
<Set name="portNumber">A</Set>
</New>
</Arg>
</New>
<New class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg>config/ABC</Arg>
<Arg type="java.lang.String">Value</Arg>
</New>
<!-- ... -->
</Configure>
就是这样。
答案 1 :(得分:1)
这不是受支持的用法,但应该有效:https://code.google.com/p/google-web-toolkit/issues/detail?id=8526
您必须使用相同版本的Jetty依赖项,并GWT is using 8.1.12
答案 2 :(得分:1)
You need to have a <resource-ref>
declared for this resource in your WEB-INF/web.xml
too.
问题是,java:comp/env
不会存在,直到:
jetty-env.xml
或顶级服务器xml文件中)org.eclipse.jetty.plus.jndi.Resource
声明中的第一个参数。WEB-INF/web.xml
声明<resource-ref>
指向此资源。 Jetty只是遵循这里的servlet规范。
对编辑#1的响应
Jetty 8 is EOL (End of Life),升级到Jetty 9.
这些说明适用于Jetty 9。
两件事......(就像上面原始答案中的链接一样)
DOCTYPE
错了。更新它。<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="portal" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="DStest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref refid="portal"/></Arg> <!-- this is where the resource is bound -->
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="org.hsqldb.jdbcDriver">
<Set name="Url">jdbc:hsqldb:hsql://localhost</Set>
<Set name="User">sa</Set>
<Set name="Password"></Set>
</New>
</Arg>
</New>
</Configure>
答案 3 :(得分:0)
感谢Thomas提出的问题和答案。我有一个非常相似的情况。获得正确的配置组合非常困难,但我终于得到了它的工作。我想我也可以在这里记录我的发现。
我这样做是为了设置使用GWT 2.6
的{{1}}。我的
目标是为Jetty 8.1.12v20130726
连接池设置JNDI
。我在跑步
位于DBCP2
GWT
中的Eclipse
<强> WEB-INF /码头-web.xml中强>
我使用DevMode
范围,但将值设置在JVM
另请注意,使用的名称为WebAppContext
(即前缀为java:comp/env/jdbc/datalakeDbcp2
)
java:comp/env/
<强> JettyLauncher.java 强>
将<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="datalakeDsDbcp2" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg> <!-- scope -->
<Arg>java:comp/env/jdbc/datalakeDbcp2</Arg> <!-- name -->
<Arg> <!-- value -->
<New class="org.apache.commons.dbcp2.BasicDataSource">
<Set name="driverClassName">org.apache.hive.jdbc.HiveDriver</Set>
<Set name="url">jdbc:hive2://someServer:somePort/someDb</Set>
<Set name="username"></Set>
<Set name="password"></Set>
</New>
</Arg>
</New>
</Configure>
从here复制到您自己的工作中
目录(自然地在JettyLauncher.java
的路径下)
只需要一次本地修改。
src/com/google/gwt/dev/shell/jetty/
bootStrapOnlyClassLoader
无需更改/*
* Change suggested by:
* https://groups.google.com/forum/#!topic/google-web-toolkit/SBFltI27ssk
*/
private final ClassLoader bootStrapOnlyClassLoader
= Thread.currentThread().getContextClassLoader();
// private final ClassLoader bootStrapOnlyClassLoader = new ClassLoader(null) {
// };
- 只需使用它即可
作为原始代码:
WebAppClassLoaderExtension
<强>的pom.xml 强>
private class WebAppClassLoaderExtension extends WebAppClassLoader {
private static final String META_INF_SERVICES = "META-INF/services/";
public WebAppClassLoaderExtension() throws IOException {
super(bootStrapOnlyClassLoader, WebAppContextWithReload.this);
}
虚拟机参数(<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>
)
Eclipse
<强> WEB-INF / web.xml中强>
也许是因为我在-Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
中使用了VM
范围,我做到了
无需更改我的jetty-web.xml
程序代码以获取名为连接的JNDI
web.xml
<强>参考强>
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);
};
,但我找不到匹配项
文档,所以我一直在使用#Jet; 9.3.x&#39;的文档。它
似乎仍然适用:
Jetty v8.1.12.v20130726
问题8507 here