19

我知道这已经被问了一百万次并且我确实做了功课,但我不完全理解的最后一件事是,是否有“Java EE JDK”?

当我下载 SDK 时,它会尝试安装很多我不想要的垃圾。所以我做了一些阅读并意识到实际上 Java SDK 是一组在技术上与 JDK 无关的工具。所以我正在寻找的只是一个干净简单的 JDK 独立下载。

我们知道“Java SE JDK”一直可以从 Sun(现在的 Oracle)网站获得。但是,我正在开发一个 Web 应用程序并且对 Java EE 的一些特性感兴趣:javax.servlet、javax.validation、javax.persistence 和 javax.transaction。所以实际上我真正在寻找的是“Java EE JDK”。

我使用的是典型的 Maven / Tomcat / Spring / Hibernate 设置,过去我总是在 Maven 提供的范围内为 Java EE 规范的这些部分添加仅 API 依赖项到我的项目中,即:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

因此,如果我为我的项目所需的所有 Java EE API 执行此操作,那么我实际上是在使用 Java SE JDK 和一些额外的手动声明的 Java EE 组件。此外,当我指示我的 IDE 使用 Java EE SDK 安装附带的 JDK 时,这些额外的命名空间不可用。

换句话说,从所有意图和目的来看,Java EE SDK 下载附带的 JDK 似乎等同于我在安装“Java SE JDK”时获得的 JDK……如果这是正确的,那么有我不需要安装 Java EE SDK,我可以简单地使用 Java (SE) JDK,按照我上面描述的方式将我需要的任何 Java EE 组件声明为 *-api/provided 依赖项。

所以我的问题是:我上面描述的是正确的方法,还是有“Java EE JDK”之类的东西?即带有诸如javax.servlet 和javax.resources 之类的未实现接口的JDK?如果存在这样的野兽,我该从哪里下载?

4

3 回答 3

20

您要问的是“我可以在没有 GlassFish、NetBeans 等的情况下一次性下载所有 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 依赖项的一部分添加的。

于 2012-05-08T13:15:30.587 回答
4

在下载 JDK 时,只有一个 JDK,无论是从 Java SE 下载还是从 Java EE 下载。

不同之处在于,当您从 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

于 2013-06-19T17:20:51.240 回答
2

一般来说,你或多或少是正确的。

应用服务器通常提供 Java EE API 以及 Java EE 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),您还必须为实现添加依赖项。否则你可以省略它。

于 2012-05-03T19:59:19.293 回答