2013-03-07 82 views
0

我正在使用包含jetty-6.1.9.jar,jsp-2.1.jar,jsp-api-2.1.jar,servlet-api-2.5-6.1.9.jar的舊項目,並在JRE 1.7下運行.0_03。Jetty如何編譯JSP?

Jetty服務器在MyServer.java的主要方法內部啓動。它創建一個WebAppContext並調用WebAppContext.setWar($ webAppRoot),其中$ webAppRoot是一個通常WEB-INF結構下的目錄的完整路徑。

所有的應用程序類和相關的JAR都在調用MyServer.main的類路徑中指定,WEB-INF/lib中沒有JAR,WEB-INF/class中沒有類(是的,我知道這很糟糕) 。 html,javascript,css和JSP文件存在於$ webAppRoot中。

Jetty doc支持JSP2.1支持表示ant-1.6.5是必需的依賴項。這個項目不包括ant,但是當你點擊它們時,JSP將被編譯並工作。

當我將應用程序類文件移動到WEB-INF/classes和它們的依賴JAR到WEB-INF/lib中時Jetty拋出了一個類未找到的錯誤,表示無法找到與ANT相關的類,當我點擊其中一個JSP頁面。爲什麼在原始配置中沒有ANT的情況下編譯JSP,但是當我將東西移動到WEB-INF ANT時變成必需的?

回答

1

你從哪裏得到這些jsp jar?

JSP是一種瘋狂的技術,它擁有更多的叉子,然後是廚房抽屜......我最近主張我們分叉,因爲我們消費的東西似乎已經死了(jsp.java.net上的那個),我們需要一條合理的路徑通過將IP可接受的jsp更新爲碼頭。無論如何,我離題了,目前我們在jetty 7,8和9中使用的jsp版本的默認行爲是使用系統編譯器,如果設置了某個屬性(org.apache.jasper.compiler.disablejsr199 = true),那麼它而是尋找我們當前發佈的eclipse編譯器或者之後的ant。所以......這個行爲完全依賴於你正在使用的jsp實現。如果你的類路徑中沒有ant,並且正在編譯jsps,那麼系統編譯器正在完成它。否則,請查找包含eclipse java編譯器的ejc jar文件,它也可以利用該編譯器。

此外,我知道你正在使用一個遺留項目,但更新到更新和支持的碼頭版本是真正的建議。並且,除非6.1.9和上次維護版本之間的許多事情被固定,否則將推薦更新到jetty 6.1.26。除此之外,如果你有jsp問題,那麼只需從6.1.26發行版更新jsp jars就可以解決這個問題。你可能只需要打開這些jsp jar的源代碼(我相信它是在maven central的org/mortbay/jetty下)。

最後,自從我碰到jetty 6以來已經有數年了,或許您需要將ant放入webapp類加載器,之前它的工作原因是因爲它在系統類加載器中?如果它在$ jetty.home/lib下,那麼webapp上下文可能被配置爲在webapp類加載器中使用父級優先級,並從那裏拉螞蟻?

我注意到有一個用於6.1.9的maven-jetty-jspc-plugin,所以它可能適合你預編譯你的jsps並完成它。 (http://repo2.maven.org/maven2/org/mortbay/jetty/maven-jetty-jspc-plugin/

+0

我的猜測是那些JSP jars來自Jetty-6.1.9發行版,因爲我剛下載它並在lib/jsp-2.1目錄中找到它們。 – NBW 2013-03-11 14:00:19

+0

我用-verbose:class運行了一些東西,並注意到當配置中的東西觸發ANT依賴時,Jasper類(JspServletWrapper,JspCompilationContext,JasperLoader,Compiler)從jsp-2.1.jar中調用。最終,來自Jasper命名空間的「AntJavaCompiler」被調用。這觸發了對ANT的依賴。 – NBW 2013-03-11 14:27:22

+0

好吧,那是在glassfish將JSP impl移出到jsp.java.net之前,我認爲我們正在將它從svn repo中取出並修補它,然後釋放這些jar。然後,支持其他編譯器的舉措將在過去的5年內完成,所以,看起來你現在可能被螞蟻困住了。如果可以的話,我仍然會進行預編譯,並在部署之前清除任何問題。 – 2013-03-11 14:42:22