【问题标题】:Best practice for multiple project setup with m2eclipse使用 m2eclipse 设置多个项目的最佳实践
【发布时间】:2011-03-21 05:28:00
【问题描述】:

示例场景:我有 2 个项目,“common-project”和“application-project”。 application-project 依赖于 common-project 提供的 API。两个项目还使用了第 3 方 jars(例如 guava)。

我正在尝试转换为使用 maven 和 m2eclipse,但不清楚最佳方法。目前,我的无 maven 设置已将第 3 方 jar 作为库添加到 common-project 上,并标记为“exported”。这样它们就被应用程序项目继承了,我不必在应用程序项目中显式地将它们添加为库。这两个项目都在积极开发中,所以我不希望先构建一个 jar 的 common-project,然后将其“安装”到我的本地存储库,然后我才能使用 application-project 中的新功能。

对于这种类型的项目布局,推荐的方法是什么?我看到以下线程大致涉及该主题: Project in Eclipse that builds a jar used by another project in Eclipse

谢谢

【问题讨论】:

    标签: java eclipse maven-2 m2eclipse


    【解决方案1】:

    示例场景:我有 2 个项目,“common-project”和“application-project”。 application-project 依赖于 common-project 提供的 API。两个项目还使用了第 3 方 jars(例如 guava)。

    我将创建 3 个 maven 项目:一个 parent 聚合模块、一个 common-project 模块和一个依赖于 common-projectapplication-project 模块,并将 guava 声明为 parent 模块中的依赖项(这样子项目将继承它)。像这样的:

    $ 树 Q3337426 Q3337426 ├── 应用项目 │   ├── pom.xml │   └── src │   ├── 主要 │ └── ... │   └── 测试 │   └── ... ├── 共同项目 │   ├── pom.xml │   └── src │   ├── 主要 │ └── ... │   └── 测试 │ └── ... └── pom.xml

    父 pom.xml 如下所示:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.stackoverflow.Q3337426</groupId>
      <artifactId>Q3337426</artifactId>
      <packaging>pom</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>Q3337426 - Root</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>r05</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <modules>
        <module>common-project</module>
        <module>application-project</module>
      </modules>
    </project>
    

    common-project 的 pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <artifactId>Q3337426</artifactId>
        <groupId>com.stackoverflow.Q3337426</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>common-project</artifactId>
      <name>Q3337426 - Common Project</name>
      <dependencies/>
    </project>
    

    应用项目的 pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <artifactId>Q3337426</artifactId>
        <groupId>com.stackoverflow.Q3337426</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>application-project</artifactId>
      <name>Q3337426 - Application Project</name>
      <dependencies>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>common-project</artifactId>
          <version>${project.version}</version>
        </dependency>
      </dependencies>
    </project>
    

    这是组织此类项目的 Maven 方式,将允许从根项目触发反应器构建以构建所有内容。

    (...) 这两个项目都在积极开发中,所以我不希望先构建一个通用项目的 jar,然后将其“安装”到我的本地存储库,然后我才能在应用程序中使用新功能-项目。

    m2eclipse 插件可以解决来自 Workspace 项目的依赖关系(这实际上是默认行为)。因此,如果您同时导入application-projectcommon-project,则前者将被配置为依赖于common-project来源(而不是依赖于jar)。使用此设置时,对 common-project 所做的更改将立即可见。

    这应该可以解决您在 IDE 中的顾虑。在 IDE 之外,在顶级项目上运行反应器构建。

    【讨论】:

    • 感谢您的全面回复,我一定会调查此事。
    • @MavenN00b:不客气。应该很容易适应您的实际项目。如果您需要澄清,请随时询问。
    【解决方案2】:

    假设你已经在你的电脑上安装了 maven,然后下载 m2eclipse 插件安装它并重新启动 eclipse。

    请记住,maven 构建的目标是生成可以分发和重用的工件,如果您不想在拥有一个稍微稳定版本的“通用项目”API 之前创建 mvn install,那也没关系,尽管在开发过程中这样做并没有错。

    对于您的情况,您可以执行以下操作之一:

    1. 如果common-project API 是绝对必要的,并且不仅会在application-project 的范围内使用,那么将您的项目构建为一个多模块项目并声明common-project 是您的@ 的一个模块987654326@。 Here is an example of how to do this.
    2. 如果否则common-project 往往不是共享工件,那么独立构建每个项目并在其 pom.xml 文件中声明两者的依赖关系 eclipse 应该能够找出两者之间的依赖关系。
    3. 您可以先开发common-project 的部分实现,将其打包,然后在application-project 中声明为依赖项,&lt;scope&gt;system&lt;scope&gt; 指定它在文件系统中的位置,这将告诉 maven 该依赖项始终存在,并且不会在任何存储库中查找它;虽然做一个mvn install 会比这更优雅,但你试图避免这种情况。

    问候。

    【讨论】:

    • 谢谢 - 我想我应该将 common-project 设为共享工件,看看效果如何。看起来我仍然可以使用 eclipse 设置项目依赖关系,以便仍然可以跨多个项目应用重构。
    • 我完全反对使用system作用域依赖,这是一种非常糟糕的做法,不应该被鼓励,人们只是在滥用它。
    【解决方案3】:

    在 POM 的 &lt;dependencies&gt; 元素中表达每个项目的依赖关系。

    m2eclipse 插件会自动从 pom.xml 中提取这些,并将它们作为库引用添加到 Eclipse 中的构建路径。

    如果application-project 依赖于common-project,那么它也会继承它的依赖关系——不需要在application-project 的 pom.xml 中再次列出两者之间的共同依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多