Shammer's Philosophy

My private adversaria

Accessing tomcat8 application but received Unsupported major.minor version 52.0

I build war application first time in age, but response is not expected the one, but UnsupportedClassVersionError.

$ curl http://10.255.230.2:8080/myapp/defaultServlet
<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.14 (Debian) - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 500 - jp/me/MyServlet : Unsupported major.minor version 52.0 (unable to load class jp.me.MyServlet)</h1><div class="line"></div><p><b>type</b> Exception report</p><p><b>message</b> <u>jp/me/MyServlet : Unsupported major.minor version 52.0 (unable to load class jp.me.MyServlet)</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b></p><pre>java.lang.UnsupportedClassVersionError: jp/me/MyServlet : Unsupported major.minor version 52.0 (unable to load class jp.me.MyServlet)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2476)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:853)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1263)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1146)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
	org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1580)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1537)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)
</pre><p><b>note</b> <u>The full stack trace of the root cause is available in the Apache Tomcat/8.0.14 (Debian) logs.</u></p><hr class="line"><h3>Apache Tomcat/8.0.14 (Debian)</h3></body></html>

This is caused by java version difference, the version of JavaVM running as tomcat8 on my DebianVM is 1.7.0_151, but the version of JavaVM on my Mac that is build environment is 1.8.0_144.

This can be resolved using --target and --source option of javac. I change my ant task like below.

  <target name="compile" depends="cleanup">
    <javac srcdir="${dir.src}" destdir="${dir.classes}" executable="${compiler}" includeantruntime="false" target="7" source="7">
      <classpath refid="classpath.tomcat" />
    </javac>
  </target>

Added target attribute and source attribute.