例外:javacコンパイラが見つかりません。おそらく、JAVA_HOMEはJDKを指していません。



Exception Unable Find Javac Compiler



異常な現象

Tomcatのソースコードの分析では、catalinaのソースコードをEclipseにインポートした後、ブラウザーアドレスhttp:// localhost:8080 /が次のように報告されます。
画像コンソールには次の例外があります。

Exception compiling Unable to find a javac compiler com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK. It is currently set to 'C:Program Files (x86)Javajdk1.6.0_45jre' Exception: Unable to find a javac compiler com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK. It is currently set to 'C:Program Files (x86)Javajdk1.6.0_45jre' at org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory.getCompiler(CompilerAdapterFactory.java:131) at org.apache.tools.ant.taskdefs.Javac.findSupportedFileExtensions(Javac.java:1210) at org.apache.tools.ant.taskdefs.Javac.scanDir(Javac.java:1147) at org.apache.tools.ant.taskdefs.Javac.collectFileListFromSourcePath(Javac.java:1181) at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1115) at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:310) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356) at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:427) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:142) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:240) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:187) at javax.servlet.http.HttpServlet.service(HttpServlet.java:720) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:139) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2460) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:119) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:157) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:662)

異常分析

例外情報は、javacを見つけることができないコンパイラが現在使用可能であることを示しています。 com.sun.tools.javac.Mainは現在のクラスパスにありません。現在のJAVA_HOMEはJDKを指していない可能性があります。 Baiduは少し時間がかかり、同じ例外を見つけました。



tomcat5.0をインストールするときに、jreのパスが指定されているため、tomcat_homeとjava_homeが環境変数に追加されていますが、jspを起動すると次の例外が発生します。
javacコンパイラが見つかりません
com.sun.tools.javac.Mainがクラスパスにありません。
おそらくJAVA_HOMEはJDKを指していない
その理由は、java.homeがJ A V A H O M E / j r e under Up、およびそのl i b under of t o o ls。 j a r with JAVA_HOME / jreが下にあり、libの下のtools.jarが続きます。JAVA_HOME / lib / tools.jarは同じではありません。jspをコンパイルするときは、後者を使用する必要があります。
注:java.homeは、実行時に$ JRE_HOMEを指します。

ローカルプロジェクトを見ると、catalinaのビルドパスライブラリにはtools.jarのjarファイルがありません。
画像



解決

tools.jarをJDKのlibフォルダーからcatalinaプロジェクトのビルドパスにコピーします。例外は解決されました:
画像
画像