2011-02-07 130 views
0

我是Maven的新手,在阅读Maven网站和Sonatype的在线Maven书籍上的文档后,我仍然不清楚如何组织好事情。Maven和Eclipse代码组织

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

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

我们使用SVN为我们的供应链管理

感谢

回答

2

你有多种选择,但可能是最简单的方法是mylib中分离出来,与自己的生命周期自身的Maven项目。这种方法的好处是您可以支持多个版本的mylib,并且您的应用程序A和B可以根据需要引用不同版本的mylib。如果mylib和appA在Eclipse中打开(并且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存储库中的版本进行编译(如果该版本存在)。

还有很多其他的选项可以使用,并且我已经在博客和Wiki上看到了很多关于各种场景最适合的讨论。但是,它通常归结为适合您和您的组织的最佳方法。只要它有效,并且您不打算构建一个定制的,不可移植的Maven解决方案,那么您可能确实无疑。

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

+0

谢谢,这有助于。我手动编辑了Eclipse .classpath文件以包含mylib(如之前的maven),并且事情在Eclipse中按预期工作。 – 2011-02-09 16:24:56