Maven зависимость для Servlet 3.0 API?

229

Как я могу сказать Maven 2 загрузить API Servlet 3.0?

Я попытался:

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

Я использую http://repository.jboss.com/maven2/, но какой репозиторий будет правильным?

Приложение:

Он работает с зависимостью для всего API Java EE 6 и следующими настройками:

<repository>
    <id>java.net</id>
    <url>http://download.java.net/maven/2</url>
</repository>

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

Я бы предпочел добавить только Servlet API в качестве зависимости, но «Brabster» может быть прав, когда отдельные зависимости были заменены профилями Java EE 6. Есть ли источник, подтверждающий это предположение?

Deamon
источник
84
Нет источников, нет javadocs в репозитории java.net/maven/2. Оракул, иди к черту!
степанчег
2
Использование javaee-Api вместо servlet-api не дает ту же версию javax.servlet.ServletContext. Я использую Spring Framework 3.1 и динамический диспетчера (аннотации). Ответ Саада - единственный ответ, который мне подходит. Вы действительно не должны использовать Паскаль, так как это кажется более общим. Черт возьми ... Gradle побеждает Maven в разрешении зависимостей.
Мукус
О боже, они изменили имя артефакта с servlet-apiна javax.servlet-api. Потерял полчаса "отладки" ...: /
insan-e

Ответы:

116

Я бы предпочел добавить только Servlet API в качестве зависимости,

Если честно, я не уверен, что понимаю почему, но не берите в голову ...

Отдельные зависимости Brabster были заменены профилями Java EE 6. Есть ли источник, подтверждающий это предположение?

Репозиторий maven из Java.net действительно предлагает следующий артефакт для WebProfile:

<repositories>
  <repository>
    <id>java.net2</id>
    <name>Repository hosting the jee6 artifacts</name>
    <url>http://download.java.net/maven/2</url>
  </repository>
</repositories>        
<dependencies>
  <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

Эта банка включает Servlet 3.0, EJB Lite 3.1, JPA 2.0, JSP 2.2, EL 1.2, JSTL 1.2, JSF 2.0, JTA 1.1, JSR-45, JSR-250.

Но, насколько мне известно, ничто не позволяет сказать, что эти API не будут распространяться отдельно (в репозитории java.net или где-то еще). Например (хорошо, это может быть частный случай), API JSF 2.0 доступен отдельно (в репозитории java.net):

<dependency>
   <groupId>com.sun.faces</groupId>
   <artifactId>jsf-api</artifactId>
   <version>2.0.0-b10</version>
   <scope>provided</scope>
</dependency>

И на самом деле, вы могли бы получить javax.servlet-3.0.jarот там и установить его в собственном хранилище.

Паскаль Тивент
источник
3
Одно небольшое исправление: javaee-web-api включает EL 2.2 (Unified Expression Language 2.2), а не EL 1.2
Андрей
1
... и для использования в gradle: скомпилируйте 'javax: javaee-web-api: 6.0'
Роберт Кристиан
1
Обратите внимание, что javaee-web-apiсодержит только заглушки метода (без байтового кода). Вы не можете использовать эту зависимость вне providedрамок, поэтому я предпочитаю предложение Саада.
Рафаэль Винтерхальтер
2
@Pascal - «Я бы предпочел добавить только Servlet API в качестве зависимости» - вы бы это сделали, если имеете дело с чистым контейнером сервлета (tomcat, jetty) по сравнению с JEE-совместимым контейнером (TomEE, wildfly и т. Д.)
YoYo
1
JavaEE-веб-апи обновлен до<version>7.0</version>
OJVM
461

Это, кажется, добавлено недавно:

http://repo1.maven.org/maven2/javax/servlet/javax.servlet-api/3.0.1/

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
</dependency>
Саад
источник
29
Вы должны добавить <scope> при условии </ scope>
Serkan Arıkuşu
1
Эй, это отлично работает, но я не уверен, что именно эту зависимость нужно использовать (например, с Tomcat 7); причина в том, что источники, привязанные к этой зависимости, не соответствуют тому, что на самом деле работает, когда вы на самом деле делаете отладку.
Евгений
5
@TejaswiRana Предоставленный объем означает, что он не упакован для войны. Зависимость доступна во время компиляции, вы ожидаете ее в папке библиотеки сервера.
banterCZ
5
Почему он просто не использовал artifactId servlet-api? Потому что интересно добавить <excludes>старый artifactId (чтобы предотвратить попадание старого и нового API сервлетов в ваш путь к классам, если одна из ваших зависимостей все еще зависит от старого)? :)
Джеффри Де Смет
3
К вашему сведению, самая последняя версия javax.servlet-api-3.1.0. Просто убедитесь, что ваш контейнер сервлетов может справиться с этой версией. Например, версия 8 Tomcat может обрабатывать 3.1 .
Василий Бурк
37

Или вы можете использовать Central Maven Repository с API Servlet 3.0, который также предоставляется для Tomcat Server 7.0.X

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet-api</artifactId>
        <version>7.0.21</version>
        <scope>provided</scope>
    </dependency>

отсюда: http://repo2.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/7.0.21/

CuH
источник
25

Вот что я использую. Все они в центральном и имеют источники.

Для Tomcat 7 (Java 7, Servlet 3.0)

Примечание. Servlet, JSP и EL API предоставляются в Tomcat. Только JSTL (если используется) должен быть связан с веб-приложением.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Для Tomcat 8 (Java 8, Servlet 3.1)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
rustyx
источник
Это работает, но предписанные зависимости в конечном итоге находятся в разделе Maven, но никогда не включаются в файл WAR, поскольку они помечены как «предоставленные». НО ... Я никогда не смогу заставить проект использовать JAR-файлы в каталоге lib Tomcat, хотя я включил этот каталог Tomcat lib в путь сборки Eclipse, и их там хорошо видно. Мой pom.xml никогда не может разрешить эти JAR-файлы Tomcat и всегда требует версию 3.0.1 JAR-файла servlet-api из локального репозитория Maven, а не поставки 3.0-версии Tomcat. Я понятия не имею, почему это ... кто-нибудь может объяснить?
Geeb
Можете ли вы указать, какую версию <groupId> javax.servlet </ groupId> <artifactId> javax.servlet-api </ artifactId> можно использовать для tomcat 8.5?
Gog1nA
24

К сожалению, добавление javaee- (web) -api в качестве зависимости не дает вам Javadoc или Source для Servlet Api, чтобы просматривать их из IDE. Это также относится ко всем другим зависимостям (JPA, EJB, ...). Если вам нужны исходные коды Servlet API / javadoc, вы можете добавить в свой файл pom.xml следующее (работает, по крайней мере, для JBoss & Glassfish):

Repository:

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public/</url>
</repository>

Зависимость:

<!-- Servlet 3.0 Api Specification -->
<dependency>
   <groupId>org.jboss.spec.javax.servlet</groupId>
   <artifactId>jboss-servlet-api_3.0_spec</artifactId>
   <version>1.0.0.Beta2</version>
   <scope>provided</scope>
</dependency>

Я полностью удалил javaee-api из своих зависимостей и заменил его на отдельные части (javax.ejb, javax.faces, ...), чтобы получить исходные коды и Javadoc для всех частей Java EE 6.

РЕДАКТИРОВАТЬ:

Вот эквивалентная зависимость Glassfish (хотя обе зависимости должны работать, независимо от того, какой сервер приложений вы используете).

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.servlet</artifactId>
  <version>3.0</version>
  <scope>provided</scope>
</dependency>
Инго Фишер
источник
1
Зачем нам указывать версию 1.0.0.Beta2, если это версия, 3.0которая нам нужна? Это делает это сложным.
Джеффри Де Смет
9

Проект Apache Geronimo обеспечивает зависимость API Servlet 3.0 от репозитория Maven Central:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>
Патрик Крокер
источник
2
Это работает, и кажется самым простым способом, спасибо! Кстати, Apache Geronimo может предложить гораздо больше: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo
5

Просто для новичков.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
Сергей Иванович
источник
4

Я нашел пример POM для API Servlet 3.0 на DZone с сентября.

Предлагаю вам использовать репозиторий java.net, по адресу http://download.java.net/maven/2/

Там есть API Java EE, например, http://download.java.net/maven/2/javax/javaee-web-api/6.0/ с POM, которые выглядят так, как будто вы ищете, например :

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-web-api</artifactId>
  <version>6.0</version>
</dependency>

Я предполагаю, что соглашения о версиях для API были изменены, чтобы соответствовать версии полной спецификации EE (то есть Java EE 6 против Servlets 3.0) как часть новых «профилей». Глядя в JAR, похоже, что там есть все сервлеты 3.0. Наслаждайтесь!

brabster
источник
Спасибо, это работает! Единственный оставшийся вопрос - заменяют ли профили Java EE 6 отдельные библиотеки. (см. дополнение в моем вопросе)
deamon
Если вы зависите от этого, вы не можете вести переносную войну (та, которая работает на JBoss, Tomcat, Jetty, ...), потому что для Tomcat / Jetty вам нужно будет поставить часть этой зависимости (сервлет) и часть его не предусмотрена (cdi), что невозможно.
Джеффри Де Смет
3

Удобный способ (рекомендуется JBoss) включить зависимости Java EE 6 показан ниже. В результате зависимости помещаются отдельно (не все в один jar, как в javaee-web-api), исходные файлы и javadocs библиотек доступны для загрузки из репозитория maven.

<properties>
    <jboss.javaee6.spec.version>2.0.0.Final</jboss.javaee6.spec.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-web-6.0</artifactId>
        <version>${jboss.javaee6.spec.version}</version>
        <scope>provided</scope>
        <type>pom</type>
    </dependency>
</dependencies>

Чтобы включить только отдельные зависимости, можно использовать dependencyManagementраздел и область import:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.spec</groupId>
                <artifactId>jboss-javaee6-specs-bom</artifactId>
                <version>${jboss.javaee6.spec.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- No need specifying version and scope. It is defaulted to version and scope from Bill of Materials (bom) imported pom. -->
        <dependency>
            <groupId>org.jboss.spec.javax.servlet</groupId>
            <artifactId>jboss-servlet-api_3.0_spec</artifactId>
        </dependency>
    </dependencies>
Андрей
источник
-3

Попробуйте этот код ...

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
мистифицировать
источник
Зависимости в альфа-стадии не всегда подходят для производственного применения.
Стефан