在带有 WTP 的多模块项目中使用 maven-eclipse-plugin

使用 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 3.3 和 WTP 2.0 创建一个新工作区
  • 在 Eclipse 中定义M2_REPO变量
  • 在某处提取示例项目
  • 从根项目 (j2ee-simple) 中的命令行启动“ mvn eclipse:eclipse install ”
  • 使用多项目导入/导出插件将所有模块导入 Eclipse
  • 在 WTP Server 视图中定义您最喜欢的应用程序服务器
  • 添加项目并将其发布到服务器
  • 启动服务器
  • 打开浏览器到http://localhost:8080/servlet/hello
  • 您的 maven 项目已启动并作为 eclipse / wtp 项目运行

源代码控制管理

Eclipse 和 Maven 支持范围广泛的 SCM 系统(如 CVS 和 SVN)。在 WTP/Maven 项目中的使用有一些特殊性,我们将在下面讨论。

控制文件

不要签入 SCM 中的 Eclipse 控制文件,您可以(并且应该)在每次需要它们时重新生成它们!

使用 CVS 时,将这些文件放在每个模块的 .cvsignore 文件中。基本版本如下所示:

.classpath
.project
.settings
target

对于 SVN,使用每个项目根目录中的 svn:ignore 属性。

组织项目

在所有开发人员之间共享准确的 Maven 配置的一种解决方案是创建一个包含 Maven 二进制版本的项目。该项目也可以包含在 SCM 系统中,以便所有开发人员都能收到任何更新(无论是新版本还是配置更改)。

多项目导入/导出插件

在使用多模块项目时,有一个可用的 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>

pom 模块

Maven 中项目的根始终是 POM 模块。这些项目也可以导入 Eclipse,然后您可以使用工作空间位置创建和使用外部工具启动。这使得发布也可以在开发人员之间交换,因此它们也可以存储在 SCM 中。

重复文件夹

当您在工作区中签出根 pom 项目时,您必须记住一些特性:

  • 首先同步模块
  • 然后刷新pom项目(这一步重要!)
  • 然后同步根 pom 项目
    (仅当根 pom 更改或您创建新模块时才需要)

请注意根 pom 项目下的模块中可访问的文件在物理上与导入项目中的文件相同。Eclipse 将在下次刷新后显示任何更改。

Maven 构建为启动

如上所述,在 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 控制之下。

EAR 项目

WTP 在 application.xml 中保存了一些额外的信息,否则这些信息将由 maven-ear-plugin 生成。我们不想干扰 maven-ear-plugin,所以 maven-eclipse-plugin 会为 WTP 生成一个特殊的 application.xml。这使您能够在服务器视图中使用 WTP 部署程序。

重要提示:这个生成的 application.xml 版本不会在 maven 构建中使用。

EJB 项目

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 项目配置中获取上下文根。

Eclipse 清单文件

在 Maven 中,清单是由 maven-jar-plugin 在打包之前从依赖项生成的,但是 WTP 需要它们运行。maven-eclipse-plugin 将生成一个仅适用于 Eclipse 的清单(位于 'target/generated-resources/eclipse/META-INF/MANIFEST.MF'),这意味着它将在正常的 maven 构建中被忽略。

使用 WTP 进行部署

当您按照此处描述的所有方向进行操作时,使用 WTP 工具为您的应用程序服务器部署 EAR 应该没有问题。因此,无需在每次更改后启动 Maven 构建。

最后

本说明使用的maven-eclipse-plugin的配置为:

        <插件>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <配置>
                        <projectNameTemplate>[artifactId]-[version]</projectNameTemplate>
                        <wtpmanifest>真</wtpmanifest>
                        <wtpapplicationxml>真</wtpapplicationxml>
                        <wtpversion>2.0</wtpversion>
                        <manifest>${basedir}/src/main/resources/META-INF/MANIFEST.MF</manifest>
                </配置>
        </插件>