使用 Maven 2 和 Eclipse 的 WTP 可以有效地开发多模块项目。
特别是对于具有 EJB 和 EAR 模块的项目,使用 Maven 2.0 和 WTP 可能很困难。然而,这些障碍有很好的解决方案,而不会失去 Maven 或 WTP 的任何功能。
一起使用 Maven 和 Eclipse 时出现的主要问题之一是 Maven 鼓励使用深层项目结构,而 eclipse 不能处理这些。解决这个问题的方法是强制 Maven 使用平面结构:
..... <modules> <module>../module1</module> <module>../module2</module> </modules> .....
这有一些非常大的缺点:您将失去使用 Maven 的一些工具(例如 release-plugin)的可能性,因为它们无法处理平面结构。
最好的方法是按照 Maven 中的预期方式做所有事情,并让 maven-eclipse-plugin 让 WTP 顺其自然。因此,建议使用深层结构:
..... <modules> <module>module1</module> <module>module2</module> </modules> .....
这个项目是一个多模块项目的示例,包含一些 JAR-、一个 WAR- 和一个 EAR- 项目。你可以从这里下载。该项目基于 j2ee-simple 原型。
按照示例步骤在 Eclipse 中安装多模块项目。
Eclipse 和 Maven 支持范围广泛的 SCM 系统(如 CVS 和 SVN)。在 WTP/Maven 项目中的使用有一些特殊性,我们将在下面讨论。
在使用多模块项目时,有一个可用的 Ecipe 插件可以提供很大帮助。该插件可以一次导入多个项目,并且可以从深度结构和平面结构中导入。
该插件称为“多项目导入/导出插件”,可在此处找到。您还可以在 eclipse 中引用更新站点,使用 URL:http ://eclipse-tools.sourceforge.net/updates/
Eclipse 中的项目名称不必与文件夹的名称相同。maven-eclipse-plugin 可以调整项目名称以包含版本名称,而不是强制 Maven 生成没有版本名称的工件(这被认为是不好的做法)!这样,Eclipse 生成的工件将与 Maven 生成的工件具有相同的名称!
“eclipse 导出耳朵工作,但 maven 生成不”(反之亦然)领域的许多问题都来自这个不同的“最终名称”问题。
避免此类问题的最佳方法是将此设置用于 maven-eclipse-plugin:
<projectNameTemplate>[artifactId]-[version]</projectNameTemplate>
Maven 中项目的根始终是 POM 模块。这些项目也可以导入 Eclipse,然后您可以使用工作空间位置创建和使用外部工具启动。这使得发布也可以在开发人员之间交换,因此它们也可以存储在 SCM 中。
如上所述,在 Eclipse 中构建 Maven 作为启动配置非常有用。要创建这些,您应该创建一个新的外部工具并填写以下值:
发射的名称——可以自由选择。
${env_var:JAVA_HOME}/bin/java
如果您使用的是 Windows,则应在上述命令中添加“.exe”扩展名。
或者,如果你真的想让构建互操作,所有开发人员都应该在他们的工作空间中创建一个名为“JAVA_EXECUTABLE”的变量,保存值“java”(linux)或“java.exe”(windows)。然后可以将上面的命令更改为
${env_var:JAVA_HOME}/bin/${JAVA_EXECUTABLE}
在这里选择根 pom 项目。
${workspace_loc:/j2ee-simple}
在下面的示例中,我们假设您已经创建了包含 Maven 发行版的组织项目。该项目称为“组织”。
-Dclassworlds.conf=${resource_loc:organization/maven-2.0/bin/m2.conf} -Dmaven.home=${resource_loc:organization/maven-2.0} -classpath ${resource_loc:organization/maven-2.0/core/boot/classworlds-1.1.jar} org.codehaus.classworlds.Launcher -DdownloadSources=true -Dmaven.test.skip=${string_prompt:maven.test.skip:false} clean eclipse:clean eclipse:eclipse install
最后三行是插件的配置和运行的实际目标。如有必要,可以更改这些。
倒数第二行用于让 Eclipse 提示运行或跳过测试。输入“true”跳过测试,其他任何东西都会运行测试。
最好激活“整个工作区”,以确保所有项目都知道更改。
最好选择 Root pom 项目位置。生成的启动文件可以置于 SCM 控制之下。
WTP 在 application.xml 中保存了一些额外的信息,否则这些信息将由 maven-ear-plugin 生成。我们不想干扰 maven-ear-plugin,所以 maven-eclipse-plugin 会为 WTP 生成一个特殊的 application.xml。这使您能够在服务器视图中使用 WTP 部署程序。
重要提示:这个生成的 application.xml 版本不会在 maven 构建中使用。
WTP 自动使用 ejbModule 的源文件夹,但这不是强制性的。改用 Maven 位置:'src/main/resources' 用于 ejb-jar.xml(等),'src/main/java' 用于 JAVA-bean。
提示:如果 WTP 无法读取您的部署描述符,请检查您是否包含了“显示名称”标签并在 xml 文件中指定了xml 编码。
当没有顶级目录用于 web 内容时,早期版本的 WTP 存在一些问题。从 v1.5 开始,这个问题不再存在!这允许使用标准 maven 目录 'src/main/webapp' 作为 web-content 文件夹。
WEB-INF/classes 目录仍然会触发问题,因此最好不要在 war 模块中包含 JAVA 类。只需将它们放在单独的 JAVA (JAR) 模块中,许多未确定的问题就会消失。
WTP 在 war 项目中需要上下文根,但在 Maven 中它是在 ear 项目中定义的。只要 ear 项目在反应器中可用(作为同一多模块构建的一部分),eclipse 插件就会从 ear 项目配置中获取上下文根。
在 Maven 中,清单是由 maven-jar-plugin 在打包之前从依赖项生成的,但是 WTP 需要它们运行。maven-eclipse-plugin 将生成一个仅适用于 Eclipse 的清单(位于 'target/generated-resources/eclipse/META-INF/MANIFEST.MF'),这意味着它将在正常的 maven 构建中被忽略。
本说明使用的maven-eclipse-plugin的配置为:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <projectNameTemplate>[artifactId]-[version]</projectNameTemplate> <wtpmanifest>true</wtpmanifest> <wtpapplicationxml>true</wtpapplicationxml> <wtpversion>2.0</wtpversion> <manifest>${basedir}/src/main/resources/META-INF/MANIFEST.MF</manifest> </configuration> </plugin>