這幾天在看 struts2技術內幕 這本書;其中有介紹了使用jetty做爲服務器,發佈應用程序; php
其中的方法,是將jetty嵌入工程啓動;書中的例子採用的是jetty6,可是在jetty的官方網站上發現:從jetty7(包含7)開始,已經從原來的 http://jetty.codehaus.org/遷移到:http://www.eclipse.org/jetty/ ; java
根據官網提供的版本說明http://www.eclipse.org/jetty/about.php: web
考慮到jdk版本,servlet的版本,決定使用7.x版本 服務器
下載/然後作嵌入;具體的嵌入過程能夠參考日誌:Jetty7的嵌入式啓動;http://my.oschina.net/u/241182/blog/117575 app
將struts2官方提供的struts-blank.war包的源碼導入eclipse,使用Jetty7嵌入啓動;出現如下異常: eclipse
發現 /struts-tags 不認,即對於 tld文件沒有解析; webapp
按照正常的方式,從servlet2.4(含2.4)版本以後,服務器應該會自動識別 jar包 META-INF目錄下的tld文件,可是在jetty中存在問題; 網站
查了很久的Google大神,都未有發現;(其實有一種解決方法:將struts-core.2.x.jar包中META-INF/struts-tags.tld文件複製到工程的WEB-INF/目錄下,可是這種方式,總趕腳不爽,遂棄之;) ui
後想着可否在jetty的wiki(http://wiki.eclipse.org/Jetty)中找到說明; spa
終於在:http://wiki.eclipse.org/Jetty/Howto/Configure_JSP 其中找到了使用tld的說明:
可是這兩部分;都是針對jetty做爲應用服務的時候,處理的配置說明;對於嵌入啓動沒有太多的說明;僅有一句話:If you're deploying via code, the equivalent is to call the WebAppContext.setAttribute(String name, String value) method。
後查看了jetty的源碼,發現了org.eclipse.jetty.webapp.MetaInfConfiguration,這個類是用來掃描jar 包下META-INFO目錄下文件使用的,這個恰好用的上;而且發現了其中的 addResource方法可用; 尤爲是在其中的processEntry方法,給了很大的啓示;
遂對原來的jettyStart代碼進行修改;
package test; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.webapp.MetaInfConfiguration; import org.eclipse.jetty.webapp.WebAppContext; /** * @author yu * */ public class JettyStart { public static void main(String[] args) throws Exception{ Server server = new Server(8080); WebAppContext context = new WebAppContext(); context.setDescriptor("./WebContent/WEB-INF/web.xml"); context.setResourceBase("./WebContent"); context.setContextPath("/sblank"); //context.set context.setParentLoaderPriority(true); ///增長了對struts2 的tld文件的解析處理
java.net.URI uri = new java.net.URI("file:F:/learn/myspace/sblank/lib/struts2-core-2.3.14.jar");
Resource strutsjar = Resource.newResource("jar:"+uri+"!/META-INF/struts-tags.tld");
MetaInfConfiguration struts2tldCfg = new MetaInfConfiguration();
String tldPattern = "org.eclipse.jetty.tlds";
struts2tldCfg.addResource(context, tldPattern, strutsjar);
System.out.println("org.eclipse.jetty.tlds is :"+context.getAttribute(tldPattern));
server.setHandler(context);
server.start();
server.join();
}
}
重點是 其中的20-25行,指定了對struts2-core.xxx.jar文件的掃描;
從新運行JettyStart , 並進行調試,呵呵 ,struts2的標籤已經能夠搞定了;;一樣這種方式也使用於其它的標籤庫;