无法实例化javax.servlet.ServletException

时间:2010-06-05 10:27:29

标签: java maven-2 servlets java-ee java-ee-6

我正在尝试使用以下代码创建类 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 in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException
...

Maven帮助我依赖:

<dependency>
 <groupId>javax</groupId>
 <artifactId>javaee-api</artifactId>
 <version>6.0</version>
 <type>jar</type>
 <scope>compile</scope>
</dependency>

我做错了什么?

3 个答案:

答案 0 :(得分:21)

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

<repositories>
  <repository>
    <id>glassfish-repository</id>
    <url>http://download.java.net/maven/glassfish</url>
  </repository>
  ...
</repositories>

<dependencies>
  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.servlet</artifactId>
    <version>3.0</version>
    <scope>test</scope>
  </dependency>
  ...
</dependencies>

请注意,不应使用compile范围声明此类依赖项,您不希望将其捆绑(它应该是providedtest,而不是compile。 1}}或runtime)。


  

我想知道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):

<repositories>
  <!-- For Hibernate Validator -->
  <repository>
    <id>jboss</id>
    <name>JBoss repository</name>
    <url>http://repository.jboss.org/maven2</url>
  </repository>
  ...
</repositories>

<dependencies>
  <!-- Bean Validation API and RI -->
  <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.0.2.GA</version>
    <scope>runtime</scope>
  </dependency>
  ...
</dependencies>
  

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

除了来自BalusC的this nice answer之外,没有任何官方提供帮助。

答案 1 :(得分:5)

结帐this post。基本上这些maven库是存根,只适用于编译。这些并不意味着在运行时引用。在运行时(即使是单元测试),您还需要引用真正的 jar文件,即servlet容器中的文件。

答案 2 :(得分:0)

确保 1. Servlet类被声明为public。 2.路径已在web.xml中正确指定,或使用批注。