How to change tomcat compiler

Viewed 14850

I'm trying to use the new Java 7 switch on strings feature.

But Tomcat is not cooperating.

I've made sure that tomcat is running under java 7 but it seems that it's not compiling under it.

I've added the following to the web.xml file, under the jsp servlet entry

    <init-param>
        <param-name>compiler</param-name>
        <param-value>C:/Program Files/Java/jdk1.7.0/bin/javac.exe</param-value>
    </init-param>

but it doesn't seem to do the trick.

Any tips would be appreciated.

5 Answers

We ran to the same problem, using jdk8 and tomcat6. Adding compilerSourceVM and compilerTargetVM with value of 1.8 to conf/web.xml will still not able to compile jsp when the code has switch with strings or lambda expression. However, replace ecj-4.3.1.jar from default lib come with tomcat 6.0.53 with ecj-4.6.1.jar (which can be found in maven repository), jsp will be able to compile successfully.

$ file ./work/Catalina/localhost/_/org/apache/jsp/test1_jsp.class
./work/Catalina/localhost/_/org/apache/jsp/test1_jsp.class: compiled Java class data, version 52.0 (Java 1.8)

Hope this help anyone who stuck with upgrading to jdk8 for tomcat6.

According to the Tomcat version used, the JSP engine provided by tomcat uses a specific default version of Java to compile and run JSP.

Tomcat 7 uses the 1.6 version

compilerSourceVM - What JDK version are the source files compatible with? (Default value: 1.6)

compilerTargetVM - What JDK version are the generated files compatible with? (Default value: 1.6)

Tomcat 8 uses the 1.7 version

compilerSourceVM - What JDK version are the source files compatible with? (Default value: 1.7)

compilerTargetVM - What JDK version are the generated files compatible with? (Default value: 1.7)

Tomcat 9 uses the 1.8 version

compilerSourceVM - What JDK version are the source files compatible with? (Default value: 1.8)

compilerTargetVM - What JDK version are the generated files compatible with? (Default value: 1.8)

Of course, you may change the versions used if the default values don't match to your requirements.

You can do that by modifying the init parameters of the org.apache.jasper.servlet.JspServlet servlet declared in your global $CATALINA_BASE/conf/web.xml.

For example the web.xml of the tomcat 8 distribution defined the JspServlet in this way :

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
...

For example to specify the 1.8 version both as source and target for JSP files, you should change it in this way :

...
<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>  
     <!-- added params -->
    <init-param>
      <param-name>compilerSourceVM</param-name>
      <param-value>1.8</param-value>
    </init-param>
    <init-param>
      <param-name>compilerTargetVM</param-name>
      <param-value>1.8</param-value>
    </init-param>
     <!-- end added params -->
    <load-on-startup>3</load-on-startup>
</servlet>
...
Related