Подтвердить что ты не робот

Разница между javax.servlet-api.jar и servlet-api.jar

В моем репозитории maven под groupId javax.servlet у меня есть два отдельных артефакта для сервлетов. Я смущен, какой я должен использовать для создания простого приложения сервлета? Какая разница между этими двумя артефактами?

4b9b3361

Ответ 1

Вам нужно добавить

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
</dependency>

к вашему проекту. Необходимая версия может отличаться - она ​​зависит от вашего контейнера сервлета, например. Кот.

<scope>provided</scope>, потому что он вам не нужен во время выполнения, он уже находится в вашем контейнере сервлета.

Ответ 2

В javax.servlet-api версии 3.0.1 имеется аннотационная папка, содержащая разные классы аннотаций, где сервлет-api версии 2.5 или ниже (то есть версия 2.4) не содержит аннотации.

Аннотации представляют метаданные. Если вы используете аннотацию, дескриптор развертывания, т.е. Web.xml, не требуется. Например, если вы используете аннотацию типа @WebServlet("/hello") в вашем файле сервлета, вам не нужно указывать отображение сервлета в файле web.xml.

Некоторые полезные аннотации:

@HandlesTypes
@HttpConstraint 
@HttpMethodConstraint
@MultipartConfig
@ServletSecurity
@WebFilter
@WebInitParam
@WebListener
@WebServlet

Ответ 3

Перейдите с javax.servlet-api.jar. Многие разработчики ошибочно включают servlet-api.jar в свою папку WEB-INF/lib. Это больше не вызывает исключения, поскольку Tomcat и другие серверы приложений распознают его как проблему при развертывании JAR файла. Тем не менее, это заставляет контейнер игнорировать любой JAR файл, содержащий javax/servlet/Servlet.class.

Ответ 4

Если вам нужно развернуть на старой версии сервера приложений, которая не поддерживает спецификацию сервлета 3.0 (надеюсь, вряд ли), придерживайтесь старого servlet-api.

Со спецификацией 3.0 они переместили ее в javax.servlet-api. Смотрите: https://javaee.github.io/servlet-spec/

Теперь, с переходом Java EE из Oracle в Eclipse Foundation (Jakarta EE), спецификация снова переместилась. Если это вообще возможно, вы можете рассмотреть возможность использования новой группы и артефакта, если хотите оставаться в курсе: jakarta.servlet:jakarta.servlet-api

https://github.com/eclipse-ee4j/servlet-api

Ответ 5

Для тех, кто использует gradle...

Если я compileOnly свою зависимость, используя compileOnly как compileOnly ниже

compileOnly "javax.servlet:javax.servlet-api:3.1.0"

тогда я получаю ошибку компиляции:

error: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
                         ^

Если я использую providedCompile как показано ниже, сборка прошла успешно.

providedCompile "javax.servlet:javax.servlet-api:3.1.0"

Чтобы использовать providedCompile зависимости Compile, вам нужно использовать плагин war.

apply plugin: 'war'