【问题标题】:The type java.util.Map$Entry cannot be resolved. Mac OS vs Debian issue?java.util.Map$Entry 类型无法解析。 Mac OS 与 Debian 的问题?
【发布时间】:2015-02-06 13:11:24
【问题描述】:

我正在用 Java 开发一个简单的 Web 应用程序,但是由于我已将计算机从 win7 更改为 mac os,因此无法部署我的应用程序。 在 SO 更改之前,我从 intellij 编译的代码/战争已毫无问题地部署到 debian。现在我得到这个(讨厌的)错误:

An error occurred at line: [1] in the generated java file: [/var/lib/tomcat8/work/Catalina/localhost/chat/org/apache/jsp/index_jsp.java]
The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files

Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:438)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:405)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:349)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

在两台机器上我都安装了 JDK8 和 Tomcat8。 Debian CPU 是一个 ARMv6,一个树莓派。从 2012 年中期开始,我的 Mac OS 是 x64。 我已经在网上搜索过,尝试更新 Tomca8,编译到 java7 并部署到 Tomcat7 实例,这让我发疯了!!我认为这可能是一个跨平台问题,或者与类编译有关,但我找不到什么!

非常感谢任何帮助,谢谢

【问题讨论】:

  • 堆栈跟踪中出现的JDTCompiler 类型表明Tomcat/Jasper 使用eclipse 编译器来编译JSP 源(源自Eclipse 模块JDT)。该编译器版本不必与 Eclipse IDE 中的相同。所以你要么更新 Tomcat 使用的 JDT,要么重新配置它以使用 ant/javac 而不是 jdt/ecj...
  • 查看您的堆栈跟踪。它试图编译 JSP 文件(或相关的东西),这些文件基本上是嵌入了 Java Source Code 的 Html 页面。它使用JDTCompiler 适配器来实现这一点,该适配器使用 Eclipse JDT,这与您正在使用的 JRE/JDK 没有任何关系。所以如果你不是手动安装的,它必须与你的tomcat捆绑在一起,我不知道你是否可以更新它。但是,适配器的存在表明此行为是可插拔的,您可以将其配置为使用javac
  • 如前所述,它与Intellij 无关。它是与 Tomcat 捆绑在一起的 Eclipse JDT,它不能处理 Java 8 类文件。如果您关注我链接的问题并查看its “Linked” section,您会看到很多类似的问题。
  • 正如对链接问题的回答中所说:“有时,当它忽略类文件的较新版本号时,您可以使用较旧的编译器。”只要引用的类文件都没有使用编译器会遇到的功能,这将起作用。关于 Java 8,只有使用 staticdefault 方法(或依赖于它们的类)的接口才有这种潜力。

标签: macos debian raspberry-pi java-8 tomcat8


【解决方案1】:

经过多次研究和测试,我无法解决这个问题。我继续开发的解决方案(这不是真正的解决方案)是用版本 7 替换所有 8 版本(jdk 和 tomcat),包括 JDK 和服务器(Tomcat)。 一个重要的注意事项是使用 OpenJDKNOT Oracle JDK。我知道,这似乎是矛盾的,但最终似乎 OpenJDK 安装了必要且正确的编译器。我没有使用 OpenJDK 版本 8 进行测试,因为我的项目只需要版本 7,但是对于有同样问题的人来说,值得尝试使用 OpenJDK 8。

希望这对某人有所帮助,如果有人对真正的解决方案有任何建议,请过去。

【讨论】:

    【解决方案2】:

    对我来说,解决方案是使用更高版本的 ecj jar,版本 ecj-4.4.2.jar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多