Maven和Eclipse代码组织

时间:2011-02-07 18:40:51

标签: eclipse maven

我是Maven的新手,在阅读了maven网站上的文档和Sonatype的在线Maven书之后,我仍然不清楚如何最好地组织事情。

我有两个应用程序,A和B共享来自mylib的代码。不同的开发人员在应用A和应用B上工作,他们是独立发布的。在我们开始使用maven之前,在Eclipse中,我将拥有一个包含应用程序A和B以及mylib的工作空间。 app A的类路径包含mylib。如果我在mylib中进行了更改,请在Eclipse中按下run,包含我的最新更改。

在Maven中,我可以创建一个父pom.xml,它引用app A和mylib。但这使得mylib成为应用程序A的子目录。如何保留mylib的一个实例而不链接应用程序A和B的构建?

我们将SVN用于我们的SCM

由于

1 个答案:

答案 0 :(得分:2)

您有多种选择,但是,最简单的方法可能是将mylib与自己的生命周期分离到自己的Maven项目中。这种方法的好处是,您可以支持具有多个版本的mylib,并且您的应用程序A和B可以根据需要引用不同版本的mylib。如果在Eclipse中打开了mylib和appA(并且mylib引用了已打开的mylib版本),则可以使用与使用Maven之前相同的方式构建应用程序。

此方法不强制要求应用程序的目录结构之间存在任何依赖关系,因此您可以使用类似于以下内容的方法:

/安装MyApps / MYLIB
/安装MyApps /的appA
/ myapps / appB

这种方法的缺点是maven不会自动构建appA和mylib(或appB和mylib),因为它们被视为单独的应用程序。但是,如果您的应用程序使用预定义和构建的mylib版本(已使用“mvn install”上传到您的本地maven存储库),这可能不是什么大问题。

以下是这些项目的POM示例:

MYLIB:

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test</groupId>
  <artifactId>myLib</artifactId>
  <versioning>0.0.1</versioning>
  <packaging>jar</packaging>

  <name>mylib</name>

  ...
</project>

的appA:

<project>
   <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>appA</artifactId>
  <packaging>jar</packaging>

  <name>appA</name>
  ...
  <dependencies>
    <groupId>com.text</groupId>
    <artifactId>mylib</artifactId</artifactId>
    <version>0.0.1</version>
  </dependencies>
  ...
</project>

appB的:

<project>
   <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>appB</artifactId>
  <packaging>jar</packaging>

  <name>appB</name>
  ...
  <dependencies>
    <groupId>com.text</groupId>
    <artifactId>mylib</artifactId</artifactId>
    <version>0.0.1</version>
  </dependencies>
  ...
</project>

如果你仍然想要父POM(一个mvn包注释)的便利,那么你可以在/ myapps文件夹中创建一个类似于以下内容的主pom:

<project>
  <groupId>com.test</groupId>
  <version>0.0.1</version>
  <artifactId>myapps</artifactId>
  <packaging>pom</packaging>
  <name>myapps</name>
  <modules>
    <module>shared</modules>
    <module>appA</modules>
    <module>appB</modules>
  </modules>
</project>

此POM将自动构建myapp,appA和appB。如果需要,您还可以创建appA和appB特定的POM(pom-appA.xml)。从Maven的角度来看,这不是最干净的方法,但它会发挥作用。您遇到的唯一问题是,如果mylib的版本不是appA或appB所依赖的版本。在这种情况下,您的appA或appB代码将针对您的maven存储库中的版本进行编译(如果该版本存在)。

您还可以使用许多其他选项,我在Blogs和Wiki上看到了大量关于哪种方案最适合各种场景的讨论。但是,它通常归结为对您和您的组织最有效的方法。只要它有效并且您不打算构建自定义的非便携式maven解决方案,那么您可能正常。

希望这会给你一些你可以使用的想法。