Не удается создать экземпляр javax.servlet.ServletException - программирование

Не удается создать экземпляр 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
...

Maven помогает мне с зависимостями:

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

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

4b9b3361

Ответ 1

Как уже упоминалось в @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, вы не хотите связывать ее (она должна быть provided или, может быть, test, но не compile или runtime)).


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

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

Второй вопрос гораздо более важен. javax.servlet - это только одна часть реализации javaee-api, где я могу найти других. Теперь мне нужно "javax/validation/Validation".

Для API Bean Validation вам понадобится следующее (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 поможет.

Ответ 2

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