我是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
由于
答案 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解决方案,那么您可能正常。
希望这会给你一些你可以使用的想法。