2016-07-03 51 views
1

將基於Jetty 6的應用程序遷移到9.2(嵌入式)。Jetty 9(emedded)運行時JSP編譯

我無法弄清楚JSP在運行時是如何編譯的(無需預編譯)。當我使用JDK時,我的應用程序運行正常。但它不能成爲JSP時JRE運行時,我得到的錯誤是:

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required 
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92) 
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378) 
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:119) 
    at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:208) 
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453) 

這清楚地表明,Jetty是尋找Java編譯器,顯然是不存在的JRE。展望碼頭9.2文檔,我讀了:

By default, the Apache JSP container will look for the Eclipse Java Compiler (jdt).

我在classpath 碼頭,JSP的JDT-2.3.3.jar但由於某些原因,碼頭似乎忽略它。

所以,我的問題是 - 我如何設置一個沒有JSP預編譯的嵌入式Jetty,並且能夠在JRE中運行。這實際上就是我在Jetty 6中通過內置jasper編譯器所做的應用程序。 Jetty 9.2甚至有可能嗎?

+0

有一個github項目演示了嵌入JSP的Jetty 9(由Jetty項目維護) - > https://github.com/jetty-project/embedded-jetty-jsp –

回答

0

其實我已經找到了解決這一簡單地做:

System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); 

這與嵌入式碼頭9.2運行在JRE提出申請愉快。 請參閱this以供參考。

+1

注意:該屬性在Jetty中不再有效9.3+。 (Jetty項目放棄了Glassfish Jasper impl並轉移到了官方的Apache Jasper,它沒有該屬性) –

+0

@Joakim - 這是否意味着Jetty 9.3+完全依賴於JDK運行? – Dima

+0

Jetty 9.3+使用Apache Jasper 8.0,它可以與jsr199編譯器(如ECJ)一起使用,並且可以使用普通的JDK。我只是說系統屬性'org.apache.jasper.compiler.disablejsr199'對Apache Jasper不再有任何意義(它不使用該系統屬性) –