Java 使用m2eclipse进行多项目设置的最佳实践

Java 使用m2eclipse进行多项目设置的最佳实践,java,eclipse,maven-2,m2eclipse,Java,Eclipse,Maven 2,M2eclipse,示例场景:我有两个项目,“公共项目”和“应用程序项目”。应用程序项目依赖于common project提供的API。两个项目都使用第三方JAR(例如番石榴) 我正在尝试使用maven和m2eclipse,但不清楚最佳方法。目前,我的maven free安装程序将第三方JAR添加为公共项目上的库,并标记为“导出”。通过这种方式,它们被应用程序项目继承,我不必显式地将它们作为库添加到应用程序项目中。这两个项目都在积极开发中,所以我不希望首先构建一个普通项目的jar,然后将其“安装”到本地存储库中,然

示例场景:我有两个项目,“公共项目”和“应用程序项目”。应用程序项目依赖于common project提供的API。两个项目都使用第三方JAR(例如番石榴)

我正在尝试使用maven和m2eclipse,但不清楚最佳方法。目前,我的maven free安装程序将第三方JAR添加为公共项目上的库,并标记为“导出”。通过这种方式,它们被应用程序项目继承,我不必显式地将它们作为库添加到应用程序项目中。这两个项目都在积极开发中,所以我不希望首先构建一个普通项目的jar,然后将其“安装”到本地存储库中,然后才能使用applicationproject中的新功能

这类项目布局的推荐方法是什么?我看到下面的帖子大致涉及了这个话题:


感谢

在POM的
元素中表达每个项目的依赖关系

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


如果
应用程序项目
依赖于
公共项目
,那么它也将继承它的依赖关系-假设您的计算机中已经安装了maven,则无需在
应用程序项目
的pom.xml中再次列出两者之间的公共依赖关系,然后下载m2eclipse插件,安装它并重新启动eclipse

请记住,maven构建的目标是生成可分发和重用的构件,如果您不想在拥有“common project”API的某个稳定版本之前进行
mvn安装
,也可以,尽管在开发过程中这样做没有错

对于您的案例,您可以执行以下操作之一:

  • 如果
    公共项目
    API是绝对必要的,并且不仅仅是在
    应用程序项目
    的范围内使用,那么将您的项目构建为多模块项目,并声明
    公共项目
    应用程序项目
    的一个模块
  • 如果公共项目通常是一个共享工件,那么在pom.xml文件中声明了两者的依赖关系后,独立构建每个项目eclipse应该能够找出两者之间的依赖关系
  • 您可以先开发
    公共项目的部分实现
    ,将其打包,然后在
    应用程序项目
    中声明为依赖项,并使用
    系统
    指定其在文件系统中的位置,这将告诉maven依赖项总是存在的,它不会在任何存储库中查找它;尽管进行
    mvn安装
    会比这更优雅,但您要尽量避免这种情况
  • 问候

    示例场景:我有两个项目,“公共项目”和“应用程序项目”。应用程序项目依赖于common project提供的API。两个项目都使用第三方JAR(例如番石榴)

    我将创建3个maven项目:一个
    父项目
    聚合模块、一个
    公共项目
    模块和一个
    应用项目
    模块,具体取决于
    公共项目
    ,并在
    父项目
    模块中将番石榴声明为依赖项(以便子项目将继承它)。大概是这样的:

    $ tree Q3337426 Q3337426 ├── application-project │   ├── pom.xml │   └── src │   ├── main │ └── ... │   └── test │   └── ... ├── common-project │   ├── pom.xml │   └── src │   ├── main │ └── ... │   └── test │ └── ... └── 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>
    
    $tree Q3337426 Q3337426 ├── 应用项目 │   ├── pom.xml │   └── src │   ├── 主要的 │ └── ... │   └── 测试 │   └── ... ├── 共同项目 │   ├── pom.xml │   └── src │   ├── 主要的 │ └── ... │   └── 测试 │ └── ... └── pom.xml 其中父pom.xml如下所示:

    $ tree Q3337426 Q3337426 ├── application-project │   ├── pom.xml │   └── src │   ├── main │ └── ... │   └── test │   └── ... ├── common-project │   ├── pom.xml │   └── src │   ├── main │ └── ... │   └── test │ └── ... └── 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>
    
    
    4.0.0
    com.stackoverflow.Q3337426
    Q3337426
    聚甲醛
    1.0-快照
    Q337426-根目录
    http://maven.apache.org
    番石榴
    番石榴
    r05
    朱尼特
    朱尼特
    3.8.1
    测试
    共同项目
    应用项目
    
    通用项目的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>
    
    <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>
    
    
    4.0.0
    Q3337426
    com.stackoverflow.Q3337426
    1.0-快照
    共同项目
    Q337426-通用项目
    
    应用程序项目的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>
    
    <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>
    
    
    4.0.0
    Q3337426
    com.stackoverflow.Q3337426
    1.0-快照
    应用项目
    Q337426-应用项目
    ${project.groupId}
    共同项目
    ${project.version}
    
    这是组织这样一个项目的Maven方式,允许从根项目触发反应堆构建来构建一切

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

    m2eclipse插件可以解析来自工作区项目的依赖关系(这实际上是默认行为)。因此,如果同时导入
    应用程序项目
    公共项目
    ,则前者将被配置为依赖于
    公共项目
    源(而不是依赖于jar)。使用此设置时,对公共项目所做的更改将立即可见


    这应该可以解决IDE内部的问题。在IDE之外,在顶层项目上运行一个reactor build。

    谢谢-我想我应该让公共项目成为一个共享工件,看看它是如何工作的。看起来我仍然可以使用eclipse设置项目依赖项,这样重构仍然可以应用于m