我有一个关于Maven、maven发布插件、git集成、pom.xml的问题,并且让pom.xml位于repo本地副本的子目录中,而不是根目录中。
设置如下:
- 我有一个github帐户,拥有有限数量的私人仓库
- 我想(正在学习)使用Maven来组织我的构建/发布
- 我可能需要创建许多Maven“项目”,每个git存储库都有几个项目
- 每个maven项目都需要一个“pom.xml”来定义其特征
- 我不能,或者至少是不方便,把所有的项目pom.xml文件放在git仓库的根目录下
- 因此,我最终为项目创建了以下文件夹布局:
- git_存储库_根目录
*项目_A文件夹 - pom.xml
- 其他代码
*项目_B文件夹 - pom.xml
- 其他代码
*等等 - ...
- 我可以成功地转到目录git_repo_root_dir/project_A并执行“mvn release:prepare”
- 我在git_repo_root_dir/project_A中执行这个步骤失败了:“mvn版本:执行”
- 问题似乎是git标记的代码被成功 checkout 到git_repo_root_dir/project_A/target/checkout/project_A以准备发布构建,但是在 checkout 之后,“maven-release”插件转到目录git_repo_root_dir/project_A/target/checkout/.而不是git_repo_root_dir/project_A/target/checkout/project_A/.来执行实际的构建,而且在试图修改pom.xml之前,也没有办法告诉“maven-release”插件进入源代码的特殊标记副本的子目录
- 问:有没有办法解决这个问题?有没有一个选项可以让“mvn release:perform”转到子目录?
下面是我在此过程中得到的实际错误:
[INFO] --- maven-release-plugin:2.0:perform (default-cli) @ standard_parent_project ---
[INFO] Checking out the project to perform the release ...
[INFO] Executing: /bin/sh -c cd "/Users/___/DEV c8ion 01/maven_based_code/0maven/standard_parent_project/target" && git clone git@github.com:clarafaction/0maven.git '/Users/___/DEV c8ion 01/maven_based_code/0maven/standard_parent_project/target/checkout'
...
/* note, the pom.xml the build should go out of at this point is at
'/Users/___/DEV c8ion 01/maven_based_code/0maven/standard_parent_project/target/checkout/standard_parent_project/pom.xml'
* /
...
[INFO] [ERROR] The goal you specified requires a project to execute but
there is no POM in this directory
(/Users/___/DEV c8ion 01/maven_based_code/0maven/standard_parent_project/target/checkout).
Please verify you invoked Maven from the correct directory. -> [Help 1]
- 谢谢-谢谢
4条答案
按热度按时间u59ebvdq1#
这样就可以了:
56lgkhnf2#
您可以按照通常告诉Maven从其他位置的POM运行的方式来执行此操作:
-f
选项。mvn --help
是这样描述它的:要在一个版本中做到这一点,你只需要把合适的选项传递给发布插件。你可以使用perform目标的“arguments”属性来实现这一点。这个属性只是告诉发布插件一些附加的参数,在发布时附加到它运行的
mvn
命令。您可以通过附加-D arguments="-f path/to/pom"
从命令行对其进行设置,或者在发布插件的配置中的pom中永久设置它,类似于gmxoilav3#
这个问题是10年前提出的,所以我想提供一个更及时的答案。
截至2022年10月,当前的/modern Maven在子目录中运行时没有任何问题。当前版本的Maven插件版本是version: 3.0.0-M6
所需要的只是在POM中定义的maven版本插件所需的常规元素:
<scm>
元素(在存储库的顶部,就像你通常所做的那样)。<distributionManagement>
元素请参阅此处的Maven文档,分发管理。<distributionManagement>
的parent,甚至settings.xml),以便更好地记录该过程,并使团队中的其他开发人员更容易部署。*工作原理
假设
在此示例中,使用了以下内容:
每个应用程序或库都在一个单独的目录中,没有使用父POM(在这个例子中)。所以你不能从顶层目录输入
mvn clean install
。这与最初的OP问题类似。正如一位评论者所说,这是一个多语言的repo中发生的问题,在那里使用了多种语言和技术。需要POM配置说明
在
lib1
中,pom定义了以下内容(仅显示maven版本插件的设置)。注意:这是将出现在此存储库的所有POM中的“相同”信息。注意:settings.xml文件需要包含您的登录或身份验证凭据,因此可能如下所示:
当你为每个maven工件创建了一个单独的git repo时,每个工件的
<scm>
标签都是不同的。创建发布
使用常规的maven release命令,仅在子目录中使用:
在这个过程的最后,maven发行版插件将做它通常做的所有事情。例如,
1.使用发布版本创建git提交。
有关步骤的完整列表,请参见maven发布插件的maven文档。
jjhzyzn04#
第一件事是要了解git,它有它的约定,每个项目都有它自己的仓库。第二件事是Maven有它的约定,把pom.xml放到它的项目的根目录中是最明显的一个。此外,你试图与Maven战斗,我会预测你会输掉这场战斗,让你的生活不容易。如果你的项目A和B是相关的(相同的版本号或相同的发布时间)在某种程度上,您应该考虑一个多模块构建,它会产生如下结构:
并且您可以在一个步骤中从根目录发布projectA(最好称之为模块)和模块b。