Maven залежність для сервлета 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>

Я вважаю за краще додавати лише сервлет API як залежність, але "Brabster" може бути правильним, що окремі залежності були замінені профілями Java EE 6. Чи є джерело, яке підтверджує це припущення?


84
У сховищі java.net/maven/2 немає джерел, немає javadocs. Оракуле, йди до біса!
stepancheg

2
Використання javaee-Api замість servlet-api не дає вам однакову версію javax.servlet.ServletContext. Я використовую Spring Framework 3.1 та використовую динамічний диспетчер (анотація). Відповідь Саада - єдина відповідь, яка працює на мене. Ви дійсно не повинні їхати з Паскалем, оскільки це здається більш загальним. Чорт .. градель б'є Мавена у вирішенні залежностей.
Мукус

OMG, вони змінили назву артефакту з servlet-apiна javax.servlet-api. Втратили півгодини "налагодження" ...: /
insan-e

Відповіді:


116

Я вважаю за краще лише додавати API сервлетів як залежність,

Якщо чесно, я не впевнений, що розумію чому, але не маю уваги ...

Окремі залежності Брабстера були замінені профілями 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: compile 'javax: javaee-web-api: 6.0'
Robert Christian

1
Зверніть увагу, що javaee-web-apiмістять лише заглушки методу (без байтового коду). Ви не можете використовувати цю залежність поза providedрамками, тому я вважаю за краще пропозицію Саада.
Рафаель Вінтерхалтер

2
@Pascal - "Я вважаю за краще додавати лише сервлет 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
Чому він просто не використав артефактІд servlet-api? Тому що це цікаво додавати <excludes>до старого artifactId (щоб не допустити отримання старого та нового сервілетів api на ваш classpath, якщо одна із ваших залежностей все ще залежить від старої)? :)
Джеффрі Де Смет

3
FYI, найновіша версія javax.servlet-api-3.1.0. Просто переконайтеся, що ваш контейнер Servlet може обробляти цю версію. Наприклад, версія 8 Tomcat може працювати з 3.1 .
Василь Бурк


25

Ось що я використовую. Усі вони перебувають у Центральній та мають джерела.

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

Примітка - API сервлетів, JSP та EL надаються в 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, сервлет 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>

Це працює, але встановлені залежності опиняються у розділі Maven, але ніколи не включаються у файл WAR, оскільки вони позначені як "надано". АЛЕ ... Я ніколи не можу отримати проект використання JAR у каталозі lib Tomcat, навіть якщо я включив цей каталог lib Tomcat у шлях побудови Eclipse, і вони там чітко видно. Мій pom.xml ніколи не може вирішити ці Tomcat JAR і завжди вимагає версії 3.0.1 сервлета-api JAR від місцевого репорта Maven, а не 3.0 версії Tomcat. Я поняття не маю, чому це ... може хтось пояснить?
Геб

Чи можете ви надати, яку версію <groupId> javax.servlet </groupId> <artifactId> javax.servlet-api </artifactId> я можу використовувати для tomcat 8.5?
Gog1nA

24

На жаль, додавання javaee- (web) -api як залежність не дає вам Javadoc або Source до сервлет-апі для перегляду їх зсередини IDE. Це також стосується всіх інших залежностей (JPA, EJB, ...) Якщо вам потрібні джерела API сервлетів / javadoc, ви можете додати наступне до свого pom.xml (працює принаймні для JBoss & Glassfish):

Репозиторій:

<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.face, ...), щоб отримати джерела та Javadocs для всіх частин 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
Це працює, і здається найпростішим способом, дякую! BTW 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 сервлетів є там. Насолоджуйтесь!


Дякую, це працює! Залишилося лише питання, якщо Java-програми EE 6 замінили окремі контури. (див. додаток до мого запитання)
deamon

Якщо ви залежаєте від цього, ви не можете скласти переносну війну (ту, яка працює на JBoss, Tomcat, Jetty, ...), тому що для Tomcat / Jetty вам потрібно буде поставити частину цієї залежності (сервлет) і частина його не передбачена (cdi), що неможливо.
Джеффрі Де Смет

3

Нижче показаний зручний спосіб (рекомендується JBoss) включити залежності Java EE 6. В результаті залежності розміщуються окремо (не всі в одному банці, як у 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>

Залежності в альфа-стадії не завжди підходять для виробничого застосування.
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.