Не может инстанцировать 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 in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException
...

Знаток помогает мне с dependecies:

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

Что я делаю неправильно?

13
задан Pascal Thivent 5 June 2010 в 14:01
поделиться

2 ответа

Как упоминалось в @ user353852, ваша текущая зависимость содержит только API Java EE 6 и не содержит тел методов. Таким образом, вы не можете запускать код против него. Чтобы запустить свой код вне контейнера, вам необходимо получить «конкретную» зависимость (из репозитория 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 , вы не хотите связать его (он должен быть предоставлен или, может быть, тест , но не компиляция или время выполнения )).


Интересно, важен ли провайдер реализации javaee? Обычно я использую серверы Apache, поэтому было бы здорово иметь ту же реализацию javaee, что и на сервере.

Теоретически нет. Но на практике я бы рекомендовал использовать JAR-файлы реализации с сервера, который вы собираетесь использовать (или из справочной реализации Java EE). Поскольку вы используете Java EE 6, это фактически означает JARS от GlassFish v3 в обоих случаях.

Второй вопрос гораздо важнее. javax.servlet - это только одна часть реализации javaee-api, где я могу найти остальные. Теперь мне нужно "javax / validation / 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 поможет.

21
ответ дан 1 December 2019 в 21:23
поделиться

Посмотрите этот пост. В основном эти библиотеки maven - это заглушки, и они подходят только для компиляции. Они не предназначены для обращения к ним во время выполнения. Во время выполнения (даже для юнит-тестов) вам нужно будет ссылаться на настоящий jar-файл, т.е. тот, который находится в вашем контейнере сервлетов.

5
ответ дан 1 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: