15

我正在尝试使用新的 Java 7 开启字符串功能。

但是Tomcat不合作。

我确保tomcat在java 7下运行,但似乎它没有在它下编译。

我在 jsp servlet 条目下的 web.xml 文件中添加了以下内容

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

但它似乎没有奏效。

任何提示将不胜感激。

4

5 回答 5

12

我们正在运行 Tomcat 6 并且遇到了同样的问题。我们的解决方案是:

  • 替换tomcat/lib/ecj-3.3.1.jarecj-3.7.2.jar(可以取自最新的 Tomcat 7 版本);
  • 将此添加到tomcat/conf/web.xml

    ...
    <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>
      <init-param>                                    <!-- this should be added -->
          <param-name>compilerSourceVM</param-name>
          <param-value>1.7</param-value>
      </init-param>
      <init-param>
          <param-name>compilerTargetVM</param-name>
          <param-value>1.7</param-value>
      </init-param>                                   <!-- last added line -->
      <load-on-startup>3</load-on-startup>
    </servlet>
    

当然,更简单的选择是安装 Tomcat 7,但这可能不是每个人的选择。

于 2012-08-04T16:01:35.953 回答
2

我们使用 jdk8 和 tomcat6 遇到了同样的问题。在 conf/web.xml 中添加compilerSourceVMandcompilerTargetVM值为 1.8 时,当代码使用字符串或 lambda 表达式进行切换时,仍然无法编译 jsp。但是,用 ecj-4.6.1.jar(可以在 maven 存储库中找到)替换默认 lib 中的 ecj-4.3.1.jar 与 tomcat 6.0.53 一起,jsp 将能够编译成功。

$ 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)

希望这可以帮助任何坚持升级到 jdk8 for tomcat6 的人。

于 2019-02-27T06:08:34.347 回答
0

你在这里混合一些东西。您希望您的 JSP 使用 Java 7 编译,而不是让 tomcat 使用 Java 7 运行。Tomcat 使用 Eclipse Java 编译器,它尚不支持 Java 7。

编辑:我做了一些挖掘。正如您在此处看到的,使用了内置的 Eclipse 编译器。与 Tomcat 7.0.19 一起分发的编译器是 ECJ 3.7,它将支持 Java 7,而不是早于 3.7.1。

于 2011-07-23T22:46:10.127 回答
0

根据使用的Tomcat版本,tomcat提供的JSP引擎使用特定的默认Java版本来编译和运行JSP。

Tomcat 7使用 1.6 版本

compilerSourceVM - 源文件与哪个 JDK 版本兼容?(默认值:1.6)

compilerTargetVM - 生成的文件与哪个 JDK 版本兼容?(默认值:1.6)

Tomcat 8使用 1.7 版本

compilerSourceVM - 源文件与哪个 JDK 版本兼容?(默认值:1.7)

compilerTargetVM - 生成的文件与哪个 JDK 版本兼容?(默认值:1.7)

Tomcat 9使用 1.8 版本

compilerSourceVM - 源文件与哪个 JDK 版本兼容?(默认值:1.8)

compilerTargetVM - 生成的文件与哪个 JDK 版本兼容?(默认值:1.8)

当然,如果默认值不符合您的要求,您可以更改使用的版本。

您可以通过修改 org.apache.jasper.servlet.JspServlet在您的 global 中声明的 servlet的 init 参数来做到这一点$CATALINA_BASE/conf/web.xml

例如web.xml,tomcat 8 发行版以这种方式定义了 JspServlet:

<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>
...

例如,要将1.8版本指定为 JSP 文件的源和目标,您应该以这种方式更改它:

...
<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>
...
于 2017-11-23T18:29:27.963 回答
-1

您是否尝试将compilerSourceVM设置为 1.7 或 7 ?(恐怕我不能声称知道这是否有效)

于 2011-07-21T19:42:08.093 回答