Joe*_*erg 6 git maven multi-module maven-release-plugin
我正在尝试发布包含在单个git存储库中的多模块项目的各个模块.
文件夹结构如下所示:
|- api/pom.xml
|- database/pom.xml
|- core/pom.xml
pom.xml
Run Code Online (Sandbox Code Playgroud)
父pom简单地用作以通过使用<modules>标记有意义的方式构建所有子组件的方式.从本质上讲,构建api,然后是数据库,然后是核心.
该项目最初是在SVN中托管的,只需指向maven scm标签中存储库中的不同路径,就可以很容易地获得maven release命令.Git似乎不是这样.
在运行时,mvn release:prepare它会根据需要对api pom执行更改,但在执行时mvn release:perform会尝试构建父pom,并且由于无法解析database/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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
该databasePOM看起来很像api,但有一个依赖关系api.同样适用core,这取决于database(并通过它api).
然而api,database工件本身对于它们自身很重要,因为api定义了客户端API和database后端API,这两者都用于与应用程序集成.由此产生了最初单独释放它们的想法 - 父pom仅仅是一种事后的想法,允许更简单地构建整个堆栈.
释放多模块构建的常用方法是从根位置执行此操作,这也意味着使用它释放所有子模块.不单独释放单个模块.如果您尝试这样做,您将失去版本之间的关系.
如果你真的想要单独发布模块,只需从中创建单独的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)
Run Code Online (Sandbox Code Playgroud)
最好的方法是在Maven中使用继承,这意味着在每个模块api,core,database中都使用这样的父类:
<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>
Run Code Online (Sandbox Code Playgroud)
这使您可以选择将api,core和database中常见的所有内容放入父级.例如,您应该仅将许可证信息放入父级,其属性如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Run Code Online (Sandbox Code Playgroud)
<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>
...
Run Code Online (Sandbox Code Playgroud)
当然,你必须在父母和其他许多事情中只定义一次scm区域.
此外,还可以并建议将dependencyManagement定义到父级中,这使您有机会仅在一个点上使用适当的版本定义依赖关系,而无需在模块中定义版本.
这将大大减小模块中的pom的大小.
结果将是通过单个mvn release:prepare等从父母释放,但是将产生不同的工件,例如hydra-api,hydra-core并且hydra-database具有相同的版本号,这将确保具有彼此相关的api,核心等.
| 归档时间: |
|
| 查看次数: |
3311 次 |
| 最近记录: |