javax:javaee-api-6.0 包含没有方法体的非抽象类

sta*_*wer 1 java java-ee-6 java-ee-7 jakarta-ee

我对 Java EE 还很陌生,当我查看编译后的代码时(我找不到 javax:javaee-api-6.0 的源代码),我注意到了这个类。

package javax.servlet;

import java.util.EventObject;

public class ServletContextEvent extends EventObject
{
  public ServletContextEvent(ServletContext paramServletContext);

  public ServletContext getServletContext();
}
Run Code Online (Sandbox Code Playgroud)

但是,javax:javaee-api-7.0 中的同一个类就是这个。

package javax.servlet;

import java.util.EventObject;

public class ServletContextEvent extends EventObject
{
  private static final long serialVersionUID = -7501701636134222423L;

  public ServletContextEvent(ServletContext source)
  {
    super(source);
  }

  public ServletContext getServletContext()
  {
    return (ServletContext)super.getSource();
  }
}
Run Code Online (Sandbox Code Playgroud)

同一包中的 ServletException 也会发生这种情况(可能还有更多,因为我没有逐一介绍)。

假设 Java Decompiler 给了我源代码的样子,从纯 Java 语法的角度来看,我无法理解为什么 6.0 类不是抽象的(或者不是接口)。

问题 1. 为什么 6.0 中的类不是抽象类或接口?

问题 2. 为什么在 7.0 中更改了实现?大家有没有意识到用javaee-api编译代码时6.0版本会出问题?

我问的原因是因为在 Intellij IDEA (12.1.4) 中使用 javaee-web-api(它具有与 javaee-api 类似的类,请参阅this)时实际上遇到了编译错误。错误如下所示:

Internal error: (java.lang.ClassFormatError) Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletContextEvent
Run Code Online (Sandbox Code Playgroud)

那么问题 3. 有没有办法在 Intellij IDEA 中避免这种情况?

rub*_*p88 5

大家有没有意识到用javaee-api编译代码时6.0版本会出问题?

是的,问题之一是在运行测试时不能使用这些类。请参阅此 Arquillian 常见问题解答Adam Bien 的博客文章

有没有办法在 Intellij IDEA 中避免这种情况?

请参阅上面的链接。该解决方案并非特定于 Intellij IDEA。