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脚本中,我检查相关的原型属性,并删除不需要的文件.
在我的脚本中,我也重命名了一些文件,并通过读取它们来编辑一些文件,进行字符串替换,然后将它们写回来.
这有点麻烦,但它确实有效.
在上述答案由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)
| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |