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 中避免这种情况?
大家有没有意识到用javaee-api编译代码时6.0版本会出问题?
是的,问题之一是在运行测试时不能使用这些类。请参阅此 Arquillian 常见问题解答和Adam Bien 的博客文章。
有没有办法在 Intellij IDEA 中避免这种情况?
请参阅上面的链接。该解决方案并非特定于 Intellij IDEA。