有没有Java EE JDK?

20
我知道这个问题已经被问了无数次,我也做了功课,但我唯一不太明白的是,是否存在“Java EE JDK”?
当我下载SDK时,它会尝试安装很多我不需要的东西。因此,我阅读了一些材料,并意识到实际上Java SDK是一组与JDK无关的工具。所以我正在寻找一个干净简单的独立的JDK下载。
我们知道“Java SE JDK”始终可以从Sun(现在是Oracle)的网站上下载。然而,我正在开发一个Web应用程序,对于javax.servlet、javax.validation、javax.persistence和javax.transaction等Java EE功能很感兴趣。因此,实际上我正在寻找的是“Java EE JDK”。
我使用典型的Maven / Tomcat / Spring / Hibernate设置,并且以前我总是向我的项目中添加API-only依赖项,以提供这些Java EE规范的部分,例如:
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
如果我为我的项目所需的所有Java EE API执行此操作,那么我实际上是在使用带有某些额外手动声明的Java EE组件的Java SE JDK。 此外,当我指示我的IDE使用随Java EE SDK安装的JDK时,这些附加的命名空间不可用。
换句话说,就所有目的而言,似乎随Java EE SDK下载的JDK与我安装"Java SE JDK"时获得的JDK等效。 如果是这样,那么我不需要安装Java EE SDK,只需像我上面描述的那样声明任何我需要的Java EE组件作为*-api /提供的依赖项即可。
因此,我的问题是:我上面描述的是正确的方法吗? 还是存在所谓的“Java EE JDK”? 即具有未实现的接口,例如javax.servlet和javax.resources等的JDK? 如果存在这样的东西,我应该从哪里下载它?
3个回答

20
您所询问的是“我能否在没有GlassFish、NetBeans等的情况下一次性下载所有Java EE组件”。
了解Java EE的确切含义将会有所帮助。它是一组规范,包括有时相关/有时不相关的“企业级”组件(无论企业意味着什么 :))。例如,Servlet API规范(如先前回答所示)是Java EE规范的一部分。JTA(事务API)、JPA、Java Mail等也是如此。
有两种类型的EE组件: 1. 仅以接口形式提供,并由应用程序服务器或第三方实现。例如JTA、JPA、Servlet-API。 2. 作为完整的参考实现提供。Java-Mail就是一个例子。我目前想不出其他的,但肯定还有其他的。
现在,像glassfish这样的完整应用程序服务器随附一组实现,因此很多时候人们会看到它们在Glassfish、Websphere等内部,认为他们需要使用这些才能使用它们。Tomcat之类的容器不是应用程序服务器,而是Servlet容器,因此仅实现了完整Java EE堆栈的子集(仅适用于Servlet所需的部分)。
为了获取完整的Java EE接口/实现,您需要将单独的接口或实现添加到构建中。在这种情况下,您只需要“知道”在哪里找到它们,这需要经验。例如,人们倾向于知道JPA是作为Hibernate依赖项的一部分添加的。

5
下载JDK时,无论您是从Java SE下载还是从Java EE下载获取,都只有一个JDK。
不同之处在于,当您从Java EE下载中获取时,它被打包在一个SDK中。该SDK附带Glassfish、代码示例、API文档和教程。我并不需要这些内容,因此更喜欢从Java SE下载中获取。
在Maven JavaEE项目中,您需要指定依赖于Java EE库。在jboss AS7的情况下,您可以使用jboss-spec依赖项来导入所有Java EE类。应用服务器提供实现Java EE API的类。
<dependency>
   <groupId>org.jboss.spec</groupId>
   <artifactId>jboss-javaee-6.0</artifactId>
   <version>3.0.2.Final-redhat-3</version>
   <type>pom</type>
   <scope>import</scope>
</dependency>

如果您想查看该pom导入的javaEE构件,请查看: http://maven.repository.redhat.com/techpreview/eap6/6.1.0/maven-repository/org/jboss/spec/jboss-javaee-6.0/3.0.2.Final-redhat-3/jboss-javaee-6.0-3.0.2.Final-redhat-3.pom

2

一般来说,你的理解基本正确。

应用服务器通常会提供Java EE API以及Java EE API的实现。因此,如果你想使用与应用服务器相同版本的API,则需要使用以下命令:

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version><!-- or whatever version your application server provides -->
   <scope>provided</scope>
</dependency>

如果您想使用更新的版本,应省略提供的范围。

如果您想使用更新或不同的实现(例如EclipseLink而不是Hibernate),还必须添加实现的依赖项。否则,您可以省略它。


2
我在示例中忘记使用“provided”,但实际上这是我经常做的事情。关于我的主要问题(“是否有Java EE JDK?”),您的答案是“没有”,有一个Java JDK和Java EE API,Java EE API的接口分布在Java JDK之外,可以通过实现的分发或仅作为API声明的分发来获取。我理解得对吗? - Amir Abiri
1
@AmirAbiri 是的,那是正确的。 - Puce

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