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

Я пытаюсь создать экземпляр класса 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>

Что я делаю не так?

Ответы [ 2 ]

21 голосов
/ 05 июня 2010

Как уже упоминалось @ 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). Поскольку вы используете Java EE 6, это фактически означает JARS из GlassFish v3 в обоих случаях.

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

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

5 голосов
/ 05 июня 2010

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

...