在使用maven原型创建项目时,有条件地包括排除文件

Thi*_*iru 10 archetypes maven maven-archetype

我试图创建一个原型,它将有条件地包含基于用户输入的文件.

例如,如果用户将使用此自定义原型并传递参数,如
-DprojectType = webProject-DprojectType = webDBProject


如果webProject仅复制与webProject相关的文件,并且其webDBProject复制与webProject和DB相关文件相关的文件.

我发现有条件的包含/排除文件在不久的将来至少不可能使用archetype-descriptor.

生成项目时,如何有条件地在原型中包含或排除文件?

我的另一个选择是在原型生成后执行目标并包含/删除不需要的文件.但我们不能利用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中使用什么版本的速度引擎?

Gre*_*eek 10

我意识到这是一个非常古老的问题,但现在(在2018年),我通过使用Maven对后期生成的groovy脚本的支持来完成这项任务.

如果在原型项目的src/main/resources/META-INF目录中包含一个名为"archetype-post-generate.groovy"的groovy脚本,那么它将在生成原型后执行.

该脚本可以访问原型的属性,例如$ {artifactId},包括任何自定义属性.

我所做的是在原型中包含所有可能的文件,然后在groovy脚本中,我检查相关的原型属性,并删除不需要的文件.

在我的脚本中,我也重命名了一些文件,并通过读取它们来编辑一些文件,进行字符串替换,然后将它们写回来.

这有点麻烦,但它确实有效.


Nik*_*iou 6

上述答案GreyBeardedGeek 是正确的。如果有人需要一个关于 Groovy 脚本应该是什么样子的例子,我写了一篇小博文

这是我帖子中的 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")
}

Run Code Online (Sandbox Code Playgroud)