无法让 jetty 读取 jetty-env.xml
Can't get jetty to read jetty-env.xml
我有以下内容:
启动代码:
Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setDescriptor("/WEB-INF/web.xml");
context.setResourceBase("/home/webapp);
context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
jetty-env.xml 在 /home/webapp/WEB-INF:
<?xml version="1.0"?>
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="properties" class="org.mortbay.jetty.plus.naming.EnvEntry">
<Arg>property_file</Arg>
<Arg>/home/webapp/web.properties</Arg>
</New>
</Configure>
jndi.properties 在类路径中:
java.naming.factory.url.pkgs=org.eclipse.jetty.jndi
java.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
初始上下文创建正常,但尝试查找 property_file 键会抛出名称未找到异常。仅枚举 returns jndi.properties.
中定义的键
Context initContext = new InitialContext();
Hashtable<?,?> ht = initContext.getEnvironment();
Enumeration<?> keys = ht.keys();
while(keys.hasMoreElements()) {
Object key = keys.nextElement();
System.out.println(key.toString() + "=" + ht.get(key).toString());
}
String props=(String)initContext.lookup("java:comp/env/property_file");
我做错了什么?
您的码头版本组合不当。
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="properties" class="org.mortbay.jetty.plus.naming.EnvEntry">
这指向 Jetty 6 的使用,并且...
java.naming.factory.url.pkgs=org.eclipse.jetty.jndi
java.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
指向 Jetty 9 使用...
这就是把你搞得一团糟的原因。
您正在使用的 XML 不适用于 Jetty 9(仅 Jetty 6),您定义的属性文件永远不应为 Jetty 9 手动定义(它存在于 jetty-jndi-{ver}.jar
)
$ jar -tvf lib/jetty-jndi-9.2.9.v20150224.jar | grep jndi.properties
125 Tue Feb 24 10:49:42 MST 2015 jndi.properties
Jetty 9 的说明位于
https://www.eclipse.org/jetty/documentation/current/jndi-embedded.html
这就是您如何设置具有 JNDI 支持的嵌入式 Jetty。
您需要在 WebAppContext
配置中启用某些部分,这应该会启用 jetty-env.xml
的使用。
即...
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration");
最后,jetty-env.xml
结构和语法记录在此处
https://www.eclipse.org/jetty/documentation/current/jndi-configuration.html
所以你的例子看起来像这样......
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
"http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="properties" class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg><Ref refid="wac"/></Arg>
<Arg>property_file</Arg>
<Arg>/home/webapp/web.properties</Arg>
<Arg type="boolean">true</Arg>
</New>
</Configure>
是的,DOCTYPE 很重要。
关于 EnvEntry 的 4 个参数,这些参数记录在 APIDOC site for EnvEntry。
最后一条建议,不要在您的项目中使用 jetty-all.jar
,它的存在只是为了允许使用 Jetty 进行一些基本的命令行实验,并不意味着在您的项目中用作依赖项。
抱歉,我是 Jetty 的新手,我忘了说我使用的是嵌入式模式。
到目前为止,我已经发现在嵌入式模式下 jetty 不会自动读取 jetty-env.xml。您必须明确地执行此操作,例如:
Resource jettyEnv = Resource.newSystemResource("jetty-env.xml");
XmlConfiguration conf = new XmlConfiguration(jettyEnv.getInputStream());
Object obj = conf.configure();
WebAppContext context = (WebAppContext)obj;
关于混合不同码头版本的回应仍然适用。
我有以下内容:
启动代码:
Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setDescriptor("/WEB-INF/web.xml");
context.setResourceBase("/home/webapp);
context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
jetty-env.xml 在 /home/webapp/WEB-INF:
<?xml version="1.0"?>
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="properties" class="org.mortbay.jetty.plus.naming.EnvEntry">
<Arg>property_file</Arg>
<Arg>/home/webapp/web.properties</Arg>
</New>
</Configure>
jndi.properties 在类路径中:
java.naming.factory.url.pkgs=org.eclipse.jetty.jndi
java.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
初始上下文创建正常,但尝试查找 property_file 键会抛出名称未找到异常。仅枚举 returns jndi.properties.
中定义的键Context initContext = new InitialContext();
Hashtable<?,?> ht = initContext.getEnvironment();
Enumeration<?> keys = ht.keys();
while(keys.hasMoreElements()) {
Object key = keys.nextElement();
System.out.println(key.toString() + "=" + ht.get(key).toString());
}
String props=(String)initContext.lookup("java:comp/env/property_file");
我做错了什么?
您的码头版本组合不当。
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="properties" class="org.mortbay.jetty.plus.naming.EnvEntry">
这指向 Jetty 6 的使用,并且...
java.naming.factory.url.pkgs=org.eclipse.jetty.jndi
java.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory
指向 Jetty 9 使用...
这就是把你搞得一团糟的原因。
您正在使用的 XML 不适用于 Jetty 9(仅 Jetty 6),您定义的属性文件永远不应为 Jetty 9 手动定义(它存在于 jetty-jndi-{ver}.jar
)
$ jar -tvf lib/jetty-jndi-9.2.9.v20150224.jar | grep jndi.properties
125 Tue Feb 24 10:49:42 MST 2015 jndi.properties
Jetty 9 的说明位于
https://www.eclipse.org/jetty/documentation/current/jndi-embedded.html
这就是您如何设置具有 JNDI 支持的嵌入式 Jetty。
您需要在 WebAppContext
配置中启用某些部分,这应该会启用 jetty-env.xml
的使用。
即...
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration");
最后,jetty-env.xml
结构和语法记录在此处
https://www.eclipse.org/jetty/documentation/current/jndi-configuration.html
所以你的例子看起来像这样......
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
"http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="properties" class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg><Ref refid="wac"/></Arg>
<Arg>property_file</Arg>
<Arg>/home/webapp/web.properties</Arg>
<Arg type="boolean">true</Arg>
</New>
</Configure>
是的,DOCTYPE 很重要。
关于 EnvEntry 的 4 个参数,这些参数记录在 APIDOC site for EnvEntry。
最后一条建议,不要在您的项目中使用 jetty-all.jar
,它的存在只是为了允许使用 Jetty 进行一些基本的命令行实验,并不意味着在您的项目中用作依赖项。
抱歉,我是 Jetty 的新手,我忘了说我使用的是嵌入式模式。 到目前为止,我已经发现在嵌入式模式下 jetty 不会自动读取 jetty-env.xml。您必须明确地执行此操作,例如:
Resource jettyEnv = Resource.newSystemResource("jetty-env.xml");
XmlConfiguration conf = new XmlConfiguration(jettyEnv.getInputStream());
Object obj = conf.configure();
WebAppContext context = (WebAppContext)obj;
关于混合不同码头版本的回应仍然适用。