无法实例化 javax.servlet.ServletException
Posted
技术标签:
【中文标题】无法实例化 javax.servlet.ServletException【英文标题】:Can't instantiate javax.servlet.ServletException 【发布时间】:2011-02-28 03:04:05 【问题描述】:我正在尝试使用以下代码创建类 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】:查看this post。基本上,这些 maven 库是存根,仅适用于编译。这些并不意味着在运行时被引用。在运行时(即使对于单元测试),您将需要引用 real jar 文件,即您的 servlet 容器中的那个。
【讨论】:
我明白了。谢谢。但我还有一个问题。在部署到 Web 服务器之前的测试阶段需要 Javaee。这是否意味着我应该在系统的类路径中实现 JavaEE,或者有一种使用 maven 的舒适方法?【参考方案2】:正如@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
范围声明,您不想捆绑它(它应该是provided
或test
,但不是compile
或runtime
) .
我想知道 javaee 实现的提供者重要吗?通常我使用 Apache 服务器,所以最好有与服务器上相同的 javaee 实现。
理论上,不会。但在实践中,我建议使用您将要使用的服务器(或 Java EE 参考实现)中的实现 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 之外,没有任何官方消息会有所帮助。
【讨论】:
帕斯卡,你能帮我多一点吗?我想知道 javaee 实现的提供者重要吗?通常我使用 Apache 服务器,所以最好有与服务器上相同的 javaee 实现。但这不是那么重要。第二个问题更为重要。 javax.servlet 只是 javaee-api 实现的一部分,我在哪里可以找到其他的。现在我需要“javax/validation/Validation”。如何确定哪个工件实现了 javaee 的各个方面。也许某处有某种“地图”? 我找到了“maven.apache.org/guides/mini/guide-coping-with-sun-jars.html”,但似乎他们已经更改了存储库的内容,因为我没有找到此页面上提到的“javax.j2ee:j2ee”工件。 @Denis 您上一条评论中提到的页面已经完全过时了。忽略它。 旧帖子,我知道,但我在使用 javax 验证库时遇到了同样的问题。 Eclipse WTP 使用与 Maven 依赖库分开的 Glassfish 库设置我的项目,因此我可以在 Eclipes 中构建,但是当我从命令行尝试 mvn clean install 时,我得到了 ClassFormatError。一年多过去了,帕斯卡,你的帖子仍然有帮助。谢谢!【参考方案3】:确保 1. servlet 类被声明为 public。 2.在web.xml中正确指定路径或使用注释。
【讨论】:
以上是关于无法实例化 javax.servlet.ServletException的主要内容,如果未能解决你的问题,请参考以下文章
在win10上安装Oracle11g 出现无法实例化怎样解决
无法实例化页面(net.thucydides.core.webdriver.DriverConfigurationError:无法实例化类 io.appium.java_client.AppiumDr