无法实例化 javax.servlet.ServletException

2022-09-04 00:40:08

我正在尝试用下面的代码创建类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>

我做错了什么?


答案 1

正如@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>

请注意,此类依赖项不应使用作用域进行声明,您不希望将其捆绑在一起(它应该是 或 可能是 ,但不是 或 )。compileprovidedtestcompileruntime


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

理论上不可以。但在实践中,我建议使用来自您将要使用的服务器(或来自 Java EE 参考实现)的实现 JAR。由于您使用的是Java EE 6,因此这实际上意味着在这两种情况下都来自GlassFish v3的JARS。

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

对于 Bean 验证 API,您需要具备以下条件(休眠验证器是 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的这个很好的答案会有所帮助。


答案 2

看看这篇文章。基本上,这些 maven 库是存根,只适合编译。这些不应在运行时引用。在运行时(即使对于单元测试),你也需要引用真正的jar文件,即从你的servlet容器中出来的文件。


推荐