6

我在带有 NetBeans 的 Web 项目中使用带有 lambda 的 jdk 8,但是当将它部署到 glassfish 时,它向我显示了这个错误:

java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>

这是由包含 lambda 表达式的代码行引起的。

我尝试更改 glassfish 设置以使用 jdk 8,但我还没有让它工作。

有什么办法让它工作吗?

4

2 回答 2

7

在使用 GlassFish 4 和 JDK 8 时,我观察到了各种奇怪的行为。似乎在使用 Java 1.8 中引入的新语法时,使用新功能的类将ArrayIndexOutOfBoundsException在启动期间触发一个类似这样的内容:

   Exception while visiting
 martinandersson/com/malivechat/ejb/events/EventService.class of size
 7094

 java.lang.ArrayIndexOutOfBoundsException: 25966
   at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)
   at org.objectweb.asm.ClassReader.accept(ClassReader.java:469)
   at org.objectweb.asm.ClassReader.accept(ClassReader.java:425)
   at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:362)
   at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165)
   at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127)
   at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:347)
   at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:67)
   at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:306)
   at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:295)
   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
   at java.lang.Thread.run(Thread.java:744)

有时,GlassFish 正在检查的类在“崩溃”中幸存下来,并且可以在应用程序中正确使用,有时则不能。崩溃的类有时会阻碍您的应用程序的部署。GlassFish 抱怨无法找到或实例化所需类型的 bean。有时,崩溃的类不会阻碍部署的成功,但是当他被使用时,类会以某种方式失败。例如,注入 bean 的资源将失败,您的应用程序将不可避免地抛出NullPointerException.

除了 GlassFish 不支持 JDK 1.8 之外,Java 本身似乎每次我尝试构建我的项目时都会崩溃,而且我的 JavaFX 应用程序有时会断电,而且他制作的各种组件非常有问题也。因此,生产代码绝对应该暂时不要升级到 Java 1.8。

更新

我也遇到了EclipseLink 2.5.2-M1的严重问题。我的一个实体类在 Java 1.7 中完美运行,然后我在其中添加了一些简洁的 JDK 8 语法。之后,EclipseLink 拒绝让实体类成为 JPA 关系的目标。EclipseLink 说实体类是“非实体”类型。一旦我将 JDK 8 的糖改写成遗留的 1.7 代码,一切都恢复正常了。

2014-07-03 更新

GlassFish 4.0.1-b05与 Java 1.8 代码只有一个问题:JPA 实体类。这意味着有问题的是EclipseLink。但我可以确认 Java 1.8 代码在 EJB:s 和 CDI 托管 bean 中工作。

于 2014-03-24T11:39:06.890 回答
6

我尝试使用 JDK8 运行 GlassFish,但也无法启动。

提交了一个 JIRA 问题GLASSFISH-19263用于跟踪目的。

于 2012-10-30T17:04:04.707 回答