有没有办法运行mvn archetype:生成并定位当前目录而不是从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 repo信息,因此作业首先执行“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是存在的,因为我不知道如何告诉archetype插件使用我当前的目录而不是创建一个名为artifactId的嵌套目录,所以我必须将所有内容移回我的本地存储库根目录并删除已创建的目录。不是世界末日,但感觉很难看。请注意,除了我最初的问题的答案之外,我愿意接受有关如何更好地实现我的总体目标的建议。 :)提前致谢!
答案 0 :(得分:2)
由于两种原因,没有某种解决方法是不可能的:
basedir
属性不起作用,请参见this issue。
原型插件始终将artifactId添加为最后一个子目录。您可以在the sources中看到它。
您的选项
保持安全,这并不可怕;-)
项目在存储库的根目录中是否重要?如果不只是在构建/集成测试之前进行cd <artifactId>
如果需要从存储库的根目录进行构建,则使用pom类型的root pom.xml,并将生成的项目作为子模块(我认为这是其他文章建议的#3)
< / li>提供PR以向maven原型插件添加所需的功能,这可能需要一些时间,但可能是最干净的解决方案
答案 1 :(得分:1)
我有三个想法:
您可以尝试使用basedir
的绝对路径,但我认为Maven在看到pom.xml
文件时会覆盖该属性。
在运行pushd ..
之前,使用脚本和mvn archetype:generate
更改为父文件夹。 popd
会让你回来。
使用maven模块构建。这样,您就有了一个构建原型的根POM,您可以运行mvn archetype:generate
来生成项目内的模块:
demo-project/
pom.xml
archetype/
pom.xml
答案 2 :(得分:0)
我知道这是个老话题,但是我有类似的问题:
原型:生成目标具有一个参数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
答案 3 :(得分:0)
我没有发表评论的名声,所以我必须做个回答。 在脚本中包含以下行不是一个好主意:
mv <artifactId>/* .
rm -rf <artifactId>
如果有人决定填写一个空的(或只是'/')artifactId,您最终将试图将整个磁盘移到该目录中,然后才删除整个磁盘。相反,您可以这样做:
mv ./<artifactId>/* .
rmdir ./<artifactId>
这一举动不会受到损害,rmdir只能删除空目录。