我正在尝试发布包含在单个git存储库中的多模块项目的各个模块。
文件夹结构如下所示:
|- api/pom.xml
|- database/pom.xml
|- core/pom.xml
pom.xml
父pom只是用于通过使用<modules>
标记以有意义的方式构建所有子组件的方式。从本质上讲,构建api,然后是数据库,然后是核心。
该项目最初是在SVN中托管的,只需指向maven scm
标记中存储库中的不同路径,就可以轻松地使maven release
命令发挥出色。 Git似乎不是这样。
运行mvn release:prepare
时,它会根据需要对api pom执行更改,但在执行mvn release:perform
时,它会尝试构建父pom,并且由于无法解析数据包而无法构建数据库包数据库/ pom.xml中列出的api-snapshot依赖。
如何配置我的scm标签以便能够在Git存储库中发布特定模块?这甚至可能吗?
以下是pom文件外观的示例设置:
父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>
<groupId>com.findwise.hydra</groupId>
<artifactId>hydra-parent</artifactId>
<version>0.2.0</version>
<packaging>pom</packaging>
<modules>
<module>api</module>
<module>database</module>
<module>core</module>
</modules>
</project>
API / 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>
<groupId>com.findwise.hydra</groupId>
<artifactId>hydra-api</artifactId>
<packaging>jar</packaging>
<version>0.2.0</version>
<name>${project.artifactId}</name>
<description>Hydra API</description>
<licenses>
...
</licenses>
<scm>
...
</scm>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
...
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
...
</plugins>
</build>
</project>
database
pom看起来非常像api
,但与api
有依赖关系。 core
也是如此,这取决于database
(通过它,api
)。
api
和database
工件本身很重要,因为api
定义了客户端API,database
后端API,两者都用于与应用程序集成。由此产生了最初单独释放它们的想法 - 父pom仅仅是一种事后的想法,允许更简单地构建整个堆栈。
答案 0 :(得分:7)
发布多模块构建的常用方法是从根位置执行此操作,这也意味着使用它释放所有子模块。不单独释放单个模块。如果你试图这样做,你将失去版本之间的关系。
如果你真的想单独发布这些模块,只需要从中创建单独的maven项目,并为每个模块提供一个git存储库。
您提到的树看起来非常像一个多模块构建,应该从根目录一步发布。
根据您更新的内容,我建议您使用具有以下结构的真实多模块构建:
root
+-- pom.xml (1.0-SNAPSHOT)
!
+-- api
! +-- pom.xml (1.0-SNAPSHOT)
+-- database
! +-- pom.xml (1.0-SNAPSHOT)
+-- core
+-- pom.xml (1.0-SNAPSHOT)
最好是在Maven中使用继承,这意味着在每个模块api,core,数据库中使用这样的父类:
<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>
<groupId>com.findwise.hydra</groupId>
<artifactId>hydra-parent</artifactId>
<version>0.2.0-SNAPSHOT</version>
</parent>
<artifactId>hydra-api</artifactId>
<description>Hydra API</description>
这使您可以选择将api,core和database中常见的所有内容放入父级。例如,您应该仅将许可证信息放入父级,如下所示的属性:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
此外,您可以将您正在使用的信息about plugins添加到父级中,例如:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
...
当然,你必须在父母和其他许多事情上一次定义scm区域。
此外,可以并建议将dependencyManagement定义到父级中,这使您有机会仅在一个点上使用适当的版本定义依赖项,而无需在模块中定义版本。
这将大大减小模块中pom的大小。
结果将通过单个mvn release:prepare
等从父级发布,但会生成具有相同版本号的hydra-api
,hydra-core
和hydra-database
等不同的工件这将确保 api ,核心等相互依存。