异常:Exception: Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK.

时间:2024-03-14 08:44:45

异常现象

在分析tomcat源码时,把catalina的源码导入eclipse中启动成功后,打开浏览器地址http://localhost:8080/出现报错如下:
异常:Exception: Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK.控制台出现如下异常:

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)\Java\jdk1.6.0_45\jre"

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)\Java\jdk1.6.0_45\jre"
	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 不在当前classpath下,可能当前的 JAVA_HOME 没有指向 JDK。百度了一下,发现同样的异常:

安装tomcat5.0的时候指定了jre的路径,导致tomcat_home, java_home都已经添加到了环境变量里,但启动jsp的时候却出现了以下的异常:
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
产生的原因是java.home指到JAVAHOME/jrelibtools.jarJAVA_HOME/jre下了,而其lib下的tools.jar跟JAVA_HOME/lib/tools.jar不一样,编译jsp的时候需要用到后者。
注: java.home在运行的时候就会指向$JRE_HOME。

看了一下本地项目catalina的Build Path Libraries内确实是没有tools.jar这个jar包:
异常:Exception: Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK.

解决办法

从JDK中的lib文件夹内复制tools.jar加入到catalina项目的build path内,异常解决:
异常:Exception: Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK.
异常:Exception: Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK.