在同一目录下使用Maven原型生成

5
有没有一种方法可以运行"mvn archetype:generate"并以当前目录为目标,而不是从artifactId创建一个目录?插件据说可以使用 basedir参数,但是传入"-Dbasedir=."并不能解决问题。
额外的背景信息是,我设置了2个Git仓库。第一个包含用于生成自定义Web服务的Maven原型的源代码,第二个是从原型生成的示例服务。我有一个Jenkins作业,通过基本上只运行“mvn clean install”来构建我的原型。我正在尝试设置第二个Jenkins作业作为我们的CI工作流程的一部分,使用"mvn archetype:generate"生成测试服务,使用"mvn clean install"构建服务,启动服务,运行一些集成测试,然后如果测试通过,则将测试服务的源代码推送到第二个存储库中。两个Jenkins作业都使用Maven 2/3构建 job type,我已在作业配置的SCM部分指定了我们的Git存储库信息,因此作业从“git clone”开始。

对于第二个工作,我的当前工作流程如下:

// Clean out the existing source and commit locally.
git rm -r . 
git commit -m "Cleaning out previous version." .

// Generate the new source from the archetype.
mvn archetype:generate ...

// Big hack that I'd like to remove.
mv <artifactId>/* .
rm -rf <artifactId>

// Add the new generated source and commit locally.
git add -A .
git commit -m "Committing new version." .

// Build and test.
mvn integration-test

// Assuming that passed, commit the changes.
git push origin master

这个 hack 的存在是因为我不确定如何告诉原型插件使用当前目录而不是创建一个名为 artifactId 的嵌套目录,所以我必须将所有内容移回到本地仓库根目录并删除所创建的目录。虽然不是世界末日,但感觉很丑陋。请注意,除了对我的初始问题的答案之外,我也乐意听取更好地实现我的总体目标的建议。:) 预先感谢!
4个回答

4

我知道这是一个老话题,但我遇到了类似的问题:

archetype:generate目标有一个outputDirectory参数,您可以将其设置为根文件夹(../)。从原型生成工件时,重要的是您的工件名称与当前目录相同。

mvn archetype:generate -DarchetypeGroupId=[archetype-group] -DarchetypeArtifactId=[archetype-id] -DoutputDirectory=../ -DartifactId=[current-folder-name] -DgroupId=[whatever-you-want] -Dversion=[ex: 0.1] -Dpackage=[jar|pom|etc.] -B

1
-DartifactId=${PWD##*/}-DoutputDirectory=../ 配对使用非常好,就像注意事项中所说的那样,你的构件名称必须与当前目录相同。 - RH Becker

3

由于以下两个原因,如果没有某种解决方法是不可能的:

  1. basedir 属性无效,请参见 this issue

  2. 原型插件总是将 artifactId 添加为最后一个子目录。您可以在 the sources 中查看此内容。

您的选择

  • 保留你的黑客攻击,它并不可怕 ;-)

  • 重要的是项目是否在仓库的根目录中吗?如果不是,请在构建/集成测试之前执行cd <artifactId>

  • 如果需要从仓库的根目录构建,则使用类型为pom的根pom.xml,并将生成的项目作为子模块(我认为这就是其他帖子建议的#3)

  • 提供一个PR以向Maven Archetype插件添加所需功能,这可能需要一些时间,但可能是最干净的解决方案


嗨,我正在尝试解决这个问题:https://github.com/apache/maven-archetype/pull/36 - Israel Perales

1
我有三个想法:

  1. 您可以尝试使用绝对路径作为basedir,但是当Maven检测到pom.xml文件时,该属性会被覆盖。

  2. 使用一个脚本和pushd ..在运行mvn archetype:generate之前切换到父文件夹。使用popd返回。

  3. 使用Maven模块构建。这样,您就有了一个根POM来构建原型,并且可以运行mvn archetype:generate在项目内生成一个模块:

     demo-project/
         pom.xml
         archetype/
             pom.xml
    

谢谢回复!我测试了#1,但似乎不起作用(或者我做错了什么)。#2可以工作,但在我的情况下不是一个选项,因为我正在一个chroot监禁的构建环境中运行,我不能上升一个级别。我不确定我完全理解#3,但我认为这对我不是一个选项,因为使用原型构建和生成服务与原型在单独的Jenkins作业中运行。 - Tyson
尝试将“生成服务”项目转换为多模块构建。 - Aaron Digulla

0

我没有足够的声望来发表评论,所以我只能回答了。 在您的脚本中加入这些行并不是一个好主意:

mv <artifactId>/* .
rm -rf <artifactId>

如果有人决定填写一个空的(或只是'/')artifactId,那么你最终会尝试将整个磁盘移动到此目录中,然后删除整个磁盘。相反,你可以这样做:
mv ./<artifactId>/* .
rmdir ./<artifactId>

移动操作不会造成任何损害,而rmdir命令只能删除空目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接