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

时间:2013-12-02 14:49:35

标签: maven maven-archetype archetypes

尝试创建一个原型,它将根据用户输入有条件地包含文件。

例如,如果用户将使用此自定义原型并传递参数,例如
-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中使用什么版本的速度引擎?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

答案 1 :(得分:1)

answer aboveGreyBeardedGeek是正确的。万一有人需要一个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()
}

可以找到herehere的更多archetype-post-generate.groovy示例!