【问题标题】:How to change tomcat compiler如何更改tomcat编译器
【发布时间】:2011-10-10 11:21:07
【问题描述】:

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

但是 Tomcat 不合作。

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

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

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

但它似乎不起作用。

任何提示将不胜感激。

【问题讨论】:

    标签: tomcat java-7


    【解决方案1】:

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

    • tomcat/lib/ecj-3.3.1.jar 替换为ecj-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,但这可能不是每个人的选择。

    【讨论】:

    • 太棒了。最后,我们能够升级到 Tomcat 7,但看起来您的解决方案确实可以解决问题。
    • 您也可以将其添加到应用程序的web.inf 中。
    【解决方案2】:

    我们在使用 jdk8 和 tomcat6 时遇到了同样的问题。将值为 1.8 的 compilerSourceVMcompilerTargetVM 添加到 conf/web.xml 时,当代码使用字符串或 lambda 表达式进行切换时,仍然无法编译 jsp。但是,将默认 lib 中的 ecj-4.3.1.jar 替换为 tomcat 6.0.53 与 ecj-4.6.1.jar(可以在 maven 存储库中找到),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 的人有所帮助。

    【讨论】:

      【解决方案3】:

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

      编辑:我做了一些挖掘工作。如您所见here,使用了内置的Eclipse 编译器。与 Tomcat 7.0.19 一起分发的编译器是 ECJ 3.7,它将支持 Java 7,而不是早于 3.7.1。

      【讨论】:

      • 迈克尔-O。我试图让 everything 在 Java 7 上运行/编译。我已经在 7 上运行了 Tomcat,我只是缺少编译能力。这就是为什么我正在寻找一种摆脱默认编译器的方法。
      • 您应该联系 tomcat 用户邮件列表。马克·托马斯对此非常活跃。
      【解决方案4】:

      根据使用的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 servlet 声明 在您的全球$CATALINA_BASE/conf/web.xml

      例如tomcat 8发行版的web.xml就是这样定义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>
      ...
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • Joel,感谢您的回复,但它不起作用:(我设置了 compilerSourceVM 和 compilerTargetVM,尝试了 1.7 和 7 并得到了相同的结果
        猜你喜欢
        • 2019-10-27
        • 2012-05-29
        • 2013-01-24
        • 2012-12-25
        • 2013-09-20
        • 2013-08-01
        • 2023-04-08
        • 2021-01-13
        • 2021-09-21
        相关资源
        最近更新 更多