Я пытаюсь создать экземпляр класса 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>
Что я делаю неправильно?
Как упоминалось в @ 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 поможет.
Посмотрите этот пост. В основном эти библиотеки maven - это заглушки, и они подходят только для компиляции. Они не предназначены для обращения к ним во время выполнения. Во время выполнения (даже для юнит-тестов) вам нужно будет ссылаться на настоящий jar-файл, т.е. тот, который находится в вашем контейнере сервлетов.