Maven 3.0的“mvn release:perform”不喜欢不在其git存储库根目录中的pom.xml

w8ntj3qf  于 2022-11-02  发布在  Maven
关注(0)|答案(4)|浏览(165)

我有一个关于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]
  • 谢谢-谢谢
u59ebvdq

u59ebvdq1#

这样就可以了:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.3.2</version>
    <executions>
        <execution>
            <id>default</id>
            <goals>
                <goal>perform</goal>
            </goals>
            <configuration>
                <pomFileName>your_path/your_pom.xml</pomFileName>
            </configuration>
        </execution>
    </executions>
</plugin>
56lgkhnf

56lgkhnf2#

您可以按照通常告诉Maven从其他位置的POM运行的方式来执行此操作:-f选项。mvn --help是这样描述它的:

-f,--file <arg>    Force the use of an alternate POM
                   file.

要在一个版本中做到这一点,你只需要把合适的选项传递给发布插件。你可以使用perform目标的“arguments”属性来实现这一点。这个属性只是告诉发布插件一些附加的参数,在发布时附加到它运行的mvn命令。您可以通过附加-D arguments="-f path/to/pom"从命令行对其进行设置,或者在发布插件的配置中的pom中永久设置它,类似于

<plugin>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <arguments>-f path/to/pom</arguments>
    </configuration>
</plugin>
gmxoilav

gmxoilav3#

这个问题是10年前提出的,所以我想提供一个更及时的答案。
截至2022年10月,当前的/modern Maven在子目录中运行时没有任何问题。当前版本的Maven插件版本是version: 3.0.0-M6
所需要的只是在POM中定义的maven版本插件所需的常规元素:

  • 指向git存储库的<scm>元素(在存储库的顶部,就像你通常所做的那样)。
  • <distributionManagement>元素请参阅此处的Maven文档,分发管理。
  • 注意:也可以通过命令行传递这些参数,但我更喜欢将它们放在一个文件中(pom.xml、<distributionManagement>的parent,甚至settings.xml),以便更好地记录该过程,并使团队中的其他开发人员更容易部署。*
  • 注意:我在Java 11中使用了Maven 3.8.5版本,但是AFAIK Java的版本并不重要。Maven的最新版本是3.8.6(目前)。我相信它可以与Java 8一起使用。目前,Maven 4还处于alpha阶段。*

工作原理

假设
在此示例中,使用了以下内容:

每个应用程序或库都在一个单独的目录中,没有使用父POM(在这个例子中)。所以你不能从顶层目录输入mvn clean install。这与最初的OP问题类似。正如一位评论者所说,这是一个多语言的repo中发生的问题,在那里使用了多种语言和技术。

需要POM配置说明

lib1中,pom定义了以下内容(仅显示maven版本插件的设置)。注意:这是将出现在此存储库的所有POM中的“相同”信息。

<scm>
        <connection>scm:git@github.com:user123/proj456.git</connection>
        <developerConnection>scm:git@github.com:user123/proj456.git</developerConnection>
        <tag>HEAD</tag>
    </scm>
    <distributionManagement>
        <downloadUrl>https://mynexus.example.com/repository/maven-public</downloadUrl>
        <repository>
            <id>proj456-release</id>
            <name>proj456 release distro</name>
            <url>https://mynexus.example.com/repository/proj456-release</url>
        </repository>
        <snapshotRepository>
            <uniqueVersion>true</uniqueVersion>
            <id>proj456-snapshot</id>
            <name>proj456 snapshot</name>
            <url>https://mynexus.example.com/repository/proj456-snapshot</url>
        </snapshotRepository>
    </distributionManagement>

注意:settings.xml文件需要包含您的登录或身份验证凭据,因此可能如下所示:

<servers>
        <server>
            <id>proj456-releases</id>
            <username>user123</username>
            <password>not-shown</password>
        </server>
        <server>
            <id>proj456-snapshot</id>
            <username>user123</username>
            <password>not-shown</password>
        </server>
    </servers>

当你为每个maven工件创建了一个单独的git repo时,每个工件的<scm>标签都是不同的。

创建发布

使用常规的maven release命令,仅在子目录中使用:

cd $HOME/work/proj456
ls -1
app1
app2
lib1
lib2

# Now CD to the directory you want to create a release for

cd lib1
mvn release:clean
mvn release:prepare release:perform

在这个过程的最后,maven发行版插件将做它通常做的所有事情。例如,

  1. POM中的-SNAPSHOT版本将替换为发行版本(由您指定)。
    1.使用发布版本创建git提交。
  2. Maven构建版本和包随该版本一起创建。
  3. Maven包被推送(上传)到NEXUS存储库(或Maven中心)。
  4. pom.xml被转移到下一个版本(添加了-SNAPSHOT),并进行git提交,以便在下一个SNAPSHOT版本上进行未来的开发。
    有关步骤的完整列表,请参见maven发布插件的maven文档。
jjhzyzn0

jjhzyzn04#

第一件事是要了解git,它有它的约定,每个项目都有它自己的仓库。第二件事是Maven有它的约定,把pom.xml放到它的项目的根目录中是最明显的一个。此外,你试图与Maven战斗,我会预测你会输掉这场战斗,让你的生活不容易。如果你的项目A和B是相关的(相同的版本号或相同的发布时间)在某种程度上,您应该考虑一个多模块构建,它会产生如下结构:

root (Git Repos)
  +-- pom.xml
       +--- projectA (pom.xml)
       +--- projectB (pom.xml)

并且您可以在一个步骤中从根目录发布projectA(最好称之为模块)和模块b。

相关问题