尝试创建一个原型,它将根据用户输入有条件地包含文件。
例如,如果用户将使用此自定义原型并传递参数,例如
-DprojectType = webProject 或 -DprojectType = webDBProject
如果webProject仅复制与webProject相关的文件,并且其webDBProject复制与webProject和DB相关文件相关的文件。
我发现使用archetype-descriptor在不久的将来至少不可能有条件地包含/排除文件。
How do I conditionally include or exclude a file from an archetype when project is generated?
我的另一个选择是在原型生成后执行目标并包含/删除不需要的文件。但我们不能利用eclipse M2E插件。
我尝试的最后一个选项是利用速度模板本身来执行后处理操作。
由于我们无法在速度模板中实例化对象,因此我尝试使用反射来创建文件实例并删除一些文件,如下所示:
$ somestring.getClass()。forName(“java.io.File”)。getMethod(“delete”,null).invoke($ somestring.getClass()。forName(“java.io.File”)。 getConstructor($ somestring.getClass())。newInstance(“delete.txt”),null)
将上述行写入速度模板文件并针对独立的速度java程序运行正常运行。但是当作为maven原型生成器的一部分执行时,同样不起作用。
我试图一步一步地执行,直到获得类,但getConstructor()部分在运行archetype:generate时无法执行。
有没有人尝试过并知道原因或有替代解决方案?
也有人知道在Maven中使用什么版本的速度引擎?
答案 0 :(得分:6)
我意识到这是一个非常古老的问题,但是现在(在2018年),我通过使用Maven对后期生成的groovy脚本的支持来完成这项任务。
如果在archetype项目的src / main / resources / META-INF目录中包含一个名为“archetype-post-generate.groovy”的groovy脚本,那么它将在生成原型后执行。
该脚本可以访问原型的属性,例如: $ {artifactId},包括任何自定义属性。
我所做的是在原型中包含所有可能的文件,然后在groovy脚本中,我检查相关的原型属性,并删除不需要的文件。
在我的脚本中,我也重命名了一些文件,并通过读取它们来编辑一些文件,进行字符串替换,然后将它们写回来。
这有点麻烦,但它确实有效。
答案 1 :(得分:1)
answer above的GreyBeardedGeek是正确的。万一有人需要一个Groovy脚本的样例,我写了small blogpost。
这是我帖子中的Groovy脚本:
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
// the path where the project got generated
Path projectPath = Paths.get(request.outputDirectory, request.artifactId)
// the properties available to the archetype
Properties properties = request.properties
// connectionType is either ftp or sftp
String connectionType = properties.get("connectionType")
// the Java package of the generated project, e.g. com.acme
String packageName = properties.get("package")
// convert it into a path, e.g. com/acme
String packagePath = packageName.replace(".", "/")
if (connectionType == "sftp") {
// delete the FTP file
Files.deleteIfExists projectPath.resolve("src/main/java/" + packagePath + "/polling/FtpFlowBuilder.java")
} else if (connectionType == "ftp") {
// delete the SFTP file
Files.deleteIfExists projectPath.resolve("src/main/java/" + packagePath + "/polling/SftpFlowBuilder.java")
}
答案 2 :(得分:0)
如果要删除整个目录,可以稍微更改上面的示例以实现该目的!我们开始:
import java.nio.file.Files
// the path where the project got generated
File rootDir = new File(request.getOutputDirectory() + "/" + request.getArtifactId())
// the properties available to the archetype
Properties properties = request.getProperties()
String addSwaggerUI = properties.get("addSwaggerUI")
// the Java package of the generated project, e.g. com.acme
String packageName = properties.get("package")
// convert it into a path, e.g. com/acme
String packagePath = packageName.replace(".", "/")
if (addSwaggerUI == "false") {
println ""
println "|---------> Hi there!"
println "|-> ${rootDir}"
println "|-> ${packageName}"
println "|-> ${packagePath}"
println "|-> ${addSwaggerUI}"
println "|---------> Bye bye!"
println ""
new File(rootDir, "src/main/java/${packagePath}/config").deleteDir()
}