对Servlet 3.0 API的Maven依赖关系?


229

如何告诉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添加为依赖项,但是“独立的依赖项已被Java EE 6 Profiles替换”了,“ Brabster”可能是正确的。是否有资料可以证实这一假设?


84
没有源,java.net / maven / 2存储库中没有javadocs。甲骨文,下地狱!
stepancheg 2011年

2
使用javaee-Api代替servlet-api不会给您相同版本的javax.servlet.ServletContext。我正在使用Spring Framework 3.1并使用动态混乱(注解)。萨阿德的答案是唯一对我有用的答案。您真的不应该选择Pascal,因为这似乎更通用。哎呀.. gradle在解决依赖性方面胜过了Maven。
Mukus 2012年

OMG,他们将工件名称从更改servlet-apijavax.servlet-api。失去了半小时的“调试” ...:/
insan-e

Answers:


116

我宁愿只添加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这个用途:编译'的javax:JavaEE的-Web的API:6.0'
罗伯特·克里斯蒂安

1
请注意,javaee-web-api仅包含方法存根(无字节码)。您不能在provided范围之外使用此依赖关系,这就是为什么我更喜欢萨阿德的建议。
拉斐尔·温特豪德2014年

2
@Pascal-“我只希望添加Servlet API作为依赖项”-如果您要处理的是纯Servlet容器(tomcat,jetty)与JEE兼容容器(TomEE,wildfly等),则可以这样做
YoYo

1
JavaEE的-Web的API已经更新到<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>
SerkanArıkuşu2012年

1
嘿,这工作正常,但我不确定这是要使用的确切依赖项(例如,对于Tomcat 7);原因是,附加到此依赖项的源与您实际进行调试时实际运行的源不匹配。
Eugen

5
@TejaswiRana提供的作用域意味着它没有打包成war。依赖项在编译时可用,您希望它在服务器库文件夹中。
banterCZ 2013年

5
为什么不重用artifactId servlet-api?因为添加<excludes>旧的artifactId 很有趣(如果您的依赖项之一仍然依赖于旧的servlet,以防止在类路径上同时获取旧的和新的servlet api)?:)
Geoffrey De Smet

3
仅供参考,最新版本是javax.servlet-api-3.1.0。只要确保您的Servlet容器可以处理该版本即可。例如,Tomcat的版本8可以处理3.1
罗勒·布尔克


25

这是我用的。所有这些都在中央,并有消息来源。

对于Tomcat 7(Java 7,Servlet 3.0)

注-Tomcat中提供了Servlet,JSP和EL API。仅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部分中,但从未被包含在WAR文件中,因为它们被标记为“已提供”。但是...即使在Eclipse构建路径中包含了该Tomcat lib目录,我也永远无法使该项目使用Tomcat lib目录中的JAR,并且可以在其中清楚地看到它们。我的pom.xml永远无法解析这些Tomcat JAR,并且始终需要本地Maven存储库中的servlet-api JAR版本3.0.1,而不是Tomcat提供的3.0版本。我不知道为什么会这样...有人可以解释吗?
Geeb

能否为tomcat 8.5使用哪个版本的<groupId> javax.servlet </ groupId> <artifactId> javax.servlet-api </ artifactId>?
Gog1nA

24

不幸的是,将javaee-(web)-api添加为依赖项不会使Javadoc或Servlet Api的源代码可以在IDE中浏览它们。对于所有其他依赖项(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


5

只为新来者。

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

4

我从9月开始在DZone上找到了Servlet 3.0 API的示例POM 。

建议您使用http://download.java.net/maven/2/上的java.net回购

那里有Java EE API,例如带有POM的http://download.java.net/maven/2/javax/javaee-web-api/6.0/看起来像是您追求的东西:

<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替换了单独的库。(请参阅我的问题的附录)
守护进程

如果依赖于此,则无法进行可移植式的战争(可在JBoss,Tomcat,Jetty等平台上使用的战争),因为对于Tomcat / Jetty,您需要放入所提供的部分依赖项(servlet),它的一部分未提供(cdi),这是不可能的。
Geoffrey De Smet

3

下面演示了包含Java EE 6依赖关系的便捷方法(建议使用JBoss)。结果,依赖项被分开放置(并非像javaee-web-api一样,所有依赖项都放在一个jar中),这些库的源文件和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>

要仅包括单个依赖项,可以使用dependencyManagementsection和scope 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>

Alpha阶段的依赖关系并不总是适合于生产应用程序。
斯蒂芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.