簡體   English   中英

無法獲得碼頭來閱讀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();

/ home / webapp / WEB-INF中的jetty-env.xml:

 <?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鍵會引發未找到名稱的異常。 枚舉僅返回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支持的Embedded 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個參數,這些參數在EnvEntry的APIDOC站點上記錄

最后一條建議,不要在您的項目中使用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;

關於混合不同碼頭版本的響應仍然適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM