Servlet 3.0 API 的 Maven 依赖是什么?

237

我该如何告诉Maven 2加载Servlet 3.0 API?

我尝试了:

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

我使用http://repository.jboss.com/maven2/,但哪个仓库是正确的呢?

附加说明:

它可以与整个Java EE 6 API的依赖项一起使用,并使用以下设置:

<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 Profiles替换。是否有可证实这一假设的来源?


88
Java.net/maven/2仓库中没有任何源代码或Javadocs文档。Oracle可以去死! - stepancheg
2
使用javaee-Api而不是servlet-api不能给您相同版本的javax.servlet.ServletContext。我正在使用Spring框架3.1并使用动态分派器(注释)。Sa'ad的答案是唯一适用于我的答案。您真的不应该选择Pascal,因为它似乎更通用。嘿.. gradle在解决依赖关系方面击败了maven。 - Mukus
天啊,他们把“servlet-api”的 构件名称 改成了“javax.servlet-api”。我浪费了半个小时来“调试”... :/ - insan-e
11个回答

467

1
嘿,这个工作得很好,但我不确定这是要使用的确切依赖项(例如与Tomcat 7一起);原因是附加到此依赖项的源代码与实际进行调试时运行的内容不匹配。 - Eugen
5
@TejaswiRana提供的范围意味着它没有打包成war文件。该依赖项在编译时可用,您希望它存在于服务器库文件夹中。 - banterCZ
5
为什么它没有重复使用artifactId servlet-api?因为添加 <excludes> 老的artifactId是一件有趣的事情(为了防止在类路径上同时获取旧的和新的servlet api,如果你的某个依赖项仍然依赖于旧的api)? :) - Geoffrey De Smet
3
最新版本是 javax.servlet-api-3.1.0,请确保您的Servlet容器可以处理该版本。例如,Tomcat 8 可以处理 3.1 - Basil Bourque
1
显然,这个变化发生在servlet-api 2.5到3.x的版本升级中。我忽略了构件名称因为它们非常相似!它从servlet-api变成了javax.servlet-api。谢谢,谢谢! - Beez
显示剩余5条评论

117

我更喜欢只将Servlet API作为依赖项添加。

说实话,我不太确定为什么,但无论如何......

Brabster 分离的依赖项已被Java EE 6 Profiles替换。是否有证实这个假设的来源?

来自Java.net的Maven存储库确实为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>

这个jar包包含了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存储库或其他地方)。例如(好吧,可能是一种特殊情况),JSF 2.0 API 可以单独获取(在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(统一表达式语言2.2),而不是EL 1.2。 - Andrey
1
对于Gradle,请使用:compile 'javax:javaee-web-api:6.0'。 - Robert Christian
1
请注意,javaee-web-api仅包含方法存根(没有字节码)。您不能在“提供的”范围之外使用此依赖项,这就是为什么我更喜欢Sa'ad的建议。 - Rafael Winterhalter
2
@Pascal - "我更喜欢只添加Servlet API作为依赖项" - 如果您正在处理纯Servlet容器(Tomcat,Jetty)而不是JEE兼容容器(TomEE,Wildfly等),则可以这样做。 - YoYo
正如 JoD. 所说,如果你不需要 "EJB Lite 3.1、JPA 2.0、JSP 2.2、EL 1.2、JSTL 1.2、JSF 2.0、JTA 1.1",那么添加 Servlet API 是有道理的。例如,这是我的需求,用于 Vaadin 开发。 - Basil Bourque
1
JavaEE Web API已更新为<version>7.0</version> - OJVM

38

28

以下是我使用的内容。所有这些都在中央仓库,并且有源代码。

对于Tomcat 7(Java 7,Servlet 3.0)

注意 - Servlet、JSP和EL API已经提供给Tomcat。只有在使用JSTL时需要将其与Web应用程序捆绑。

<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>

这个可以工作,但是指定的依赖项最终出现在Maven部分中,但由于被标记为“provided”,因此从未包含在WAR文件中。但是...即使我已经在Eclipse构建路径中包含了Tomcat lib目录并且它们可以清楚地看到,在项目中我仍无法让其使用Tomcat lib目录中的JAR文件。我的pom.xml始终无法解析这些Tomcat JAR文件,并且总是需要本地Maven存储库中版本为3.0.1的servlet-api JAR文件,而不是Tomcat提供的3.0版本。我不知道为什么会这样...有人能解释一下吗? - Geeb
您能告诉我在Tomcat 8.5中可使用哪个版本的<groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId>吗? - Gog1nA

24

很不幸,将javaee-(web)-api添加为依赖项并不能为您提供浏览IDE中的Servlet Api的Javadoc或源代码。这也适用于所有其他依赖项(JPA,EJB等)。 如果您需要Servlet 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.faces等)替换它,以获取Java EE 6的所有部分的源代码和Javadocs。

编辑:

这是等效的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?这会使事情变得复杂。 - Geoffrey De Smet

9

Apache Geronimo项目在Maven Central仓库提供了一个Servlet 3.0 API依赖项:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>

2
这个方法可行,而且似乎是最简单的方式,谢谢!顺便说一句,Apache Geronimo还有更多的功能可以提供:http://mvnrepository.com/artifact/org.apache.geronimo.specs - stivlo

6

适用于初学者。

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

4

我在DZone上找到了一个示例POM,用于Servlet 3.0 API,时间是从去年9月份。

建议您使用java.net仓库,在http://download.java.net/maven/2/可以找到Java EE的API,例如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 Servlet相关内容都在其中。祝使用愉快!

谢谢,它有效!唯一剩下的问题是,Java EE 6 Profiles是否替换了单独的库。(请参见我的问题中的附录) - deamon
如果你依赖于这个,你就无法制作可移植的war包(能在JBoss、Tomcat、Jetty等平台上工作),因为对于Tomcat/Jetty,你需要将部分依赖项标记为provided(如servlet),而将另一部分标记为非provided(如cdi),这是不可能的。 - Geoffrey De Smet

3

以下是一种方便的方法(JBoss推荐)来包含Java EE 6依赖项。结果,依赖项被分开放置(不像javaee-web-api中所有的都在一个jar包中),库源文件和javadoc可以从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>

0
请将此依赖项放置,并不要忘记选择:包括“提供”的范围依赖项。
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>

1
这是在Intellij中进行调试,我正在使用JHipster。 - Adolfo Ruiz Ruiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接