无法实例化javax.servlet.ServletException

我正在尝试使用以下代码创建类javax.servlet.ServletException的实例

public class MyTroubleViewer { public static void main(String[] args) { javax.servlet.ServletException servletException = new javax.servlet.ServletException("Hello"); System.out.println(servletException.getMessage()); } } 

但我在创建时遇到exception:

 Exception in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException ... 

Maven帮助我依赖:

  javax javaee-api 6.0 jar compile  

我究竟做错了什么?

正如@ user353852所提到的,您当前的依赖项仅包含Java EE 6 API,并且不包含任何方法体。 所以你不能对它运行代码。 要在容器外部运行代码,您需要获得“具体”依赖关系(来自GlassFish存储库):

   glassfish-repository http://download.java.net/maven/glassfish  ...    org.glassfish javax.servlet 3.0 test  ...  

请注意,不应使用compile范围声明此类依赖项,您不希望将其捆绑(应provided或可能test ,但不能compileruntime )。


我想知道javaee实现的提供者是否重要? 通常我使用Apache服务器,因此拥有与服务器上相同的javaee实现将是很棒的。

从理论上讲,没有。 但实际上,我建议使用您要使用的服务器(或Java EE Reference Implementation)中的实现JAR。 由于您使用的是Java EE 6,因此在两种情况下,这实际上都意味着来自GlassFish v3的JARS。

第二个问题更为重要。 javax.servlet只是javaee-api实现的一部分,在哪里可以找到其他的。 现在我需要“javax / validation / Validation”。

对于Bean Validation API,您需要以下内容(Hibernate Validator是RI):

    jboss JBoss repository http://repository.jboss.org/maven2  ...     javax.validation validation-api 1.0.0.GA provided   org.hibernate hibernate-validator 4.0.2.GA runtime  ...  

如何确定哪个工件实现了javaee的每个方面。 也许在某处有某种“地图”?

没有任何正式的,但BalusC的这个好答案将有所帮助。

看看这篇文章 。 基本上这些maven库是存根,只适用于编译。 这些并不意味着在运行时引用。 在运行时(即使是unit testing),您将需要引用真正的 jar文件,即servlet容器中的文件。