Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven中有很多继承的单插件配置文件是个好主意吗?_Java_Maven 2 - Fatal编程技术网

Java Maven中有很多继承的单插件配置文件是个好主意吗?

Java Maven中有很多继承的单插件配置文件是个好主意吗?,java,maven-2,Java,Maven 2,在我们的基础设施中,我们有许多由Maven2构建的小型Java项目。每个项目都有自己的pom.xml,它最终继承自我们公司的“主”父pom 我们最近开始在我们的父pom中添加一些小的配置文件,默认情况下是禁用的,一旦启用,就会以传统的方式执行单个插件 示例: “sources”概要文件执行maven源插件来创建项目源的jar “clover”配置文件执行maven-clover2-plugin以生成clover报告。它还嵌入了我们的Clover许可文件,因此不需要在子项目中重新指定 “fitn

在我们的基础设施中,我们有许多由Maven2构建的小型Java项目。每个项目都有自己的pom.xml,它最终继承自我们公司的“主”父pom

我们最近开始在我们的父pom中添加一些小的配置文件,默认情况下是禁用的,一旦启用,就会以传统的方式执行单个插件

示例:

  • sources”概要文件执行maven源插件来创建项目源的jar
  • clover”配置文件执行maven-clover2-plugin以生成clover报告。它还嵌入了我们的Clover许可文件,因此不需要在子项目中重新指定
  • fitnesse”配置文件执行fitnesse maven插件以运行与项目相关联的fitnesse测试。它包含fitnesse服务器主机和端口以及其他不需要重复的信息
这用于在我们的CI服务器中指定生成,如:

mvn test -P clover
mvn deploy site-deploy -P fitnesse,sources
等等

到目前为止,这似乎为可选功能的组合提供了方便


然而,继续使用这种方法是否存在任何危险或陷阱(明显或其他)?这种类型的功能是否可以用另一种方式更好地实现或表达?

此解决方案的问题在于,您可能正在创建一个“选择”模型,这有点不专业。在你描述的个人资料中,你是介于两者之间;如果每个配置文件本身都能产生不错的结果,那么您就可以了。当你开始需要特定的配置文件组合时,我认为你正在走向麻烦

单个开发人员通常会遇到一致性问题,因为他们忘记了给定场景应该使用哪一组概要文件。您的里程数可能会有所不同,但我们在这方面遇到了实际问题。您的一半开发人员在很短的时间内就会忘记“正确”的组合,并经常浪费时间,因为他们在错误的时间运行错误的组合


您将遇到的实际问题是,AFAIK无法拥有一组激活一组子概要文件的“元”概要文件。如果有一个很好的方法来创建一个雨伞配置文件,这将是一个非常整洁的功能。您的“fitnesse”和“sources”配置文件应该是私有的,由一个或多个元配置文件激活。(您可以在settings.xml中为每个开发人员激活一个默认设置)

您似乎对这种方法有点怀疑,但不确定原因——毕竟,这是非常方便的。无论如何,这就是我的感受:我真的不知道为什么,但这似乎有点奇怪

让我们来考虑这两个问题: a) 配置文件的用途是什么? b) 我们应该将您的方法与哪些备选方法进行比较

关于a),我认为概要文件适用于不同的构建或执行环境。您可能依赖于本地安装的软件,在本地安装的软件中,您将使用配置文件来定义各个环境中可执行文件的路径。或者您可能有不同运行时配置的概要文件,例如“开发”、“测试”、“生产”。 有关这方面的更多信息,请参见和

至于b),我想到的想法是:

  • 使用命令行属性触发插件。例如mvn-Dfitnesse=true部署。就像众所周知的eclipse插件的-DdownloadSources=true,或者surefire的-Dmaven.test.skip=true。 但这需要插件有一个标志来触发执行。并不是所有需要的插件都有这个功能
  • 明确提出目标。您可以在一个命令行上调用多个目标,如“mvn清洁包战争:爆炸”。当fitnesse自动执行(使用相应的配置文件)时,意味着其执行绑定到生命周期阶段。也就是说,只要达到生命周期的那个阶段,插件就会被执行。 您不应该将插件执行绑定到生命周期阶段,而应该能够包含插件,但只在显式调用插件时执行它。 所以您的调用看起来像“mvn fitnesse:run source:jar deploy”
  • 问题a)的答案或许可以解释“奇怪”。这并不是配置文件的目的

    因此,我认为备选方案2实际上可能是一个更好的办法。当用于不同执行或构建环境的“真实”配置文件发挥作用时,使用配置文件可能会出现问题。最终,您可能会遇到一个混乱的配置文件组合,其中配置文件表示非常不同的内容(例如,“test”表示环境,“fitnesse”表示目标)。
    如果你能明确地称之为目标,我认为这将是非常明确和灵活的。记住插件/目标名称应该不会比记住配置文件名称更难。

    在Maven中拥有多个配置文件并没有问题,事实上,我认为它们是允许构建启用和禁用功能类的一种很好的方法。我建议根据它们的功能而不是插件来命名它们,并考虑在同一配置文件中将功能相关的插件分组。 作为您遵循的一个先例,定义了一个“发布概要文件”,其中包括源、javadoc和部署插件的配置


    你应该考虑遵循这种方法,这样你的“FiNeNeSe”配置文件将成为“集成测试”,并且如果稍后需要,你可以选择在该配置文件中定义额外的插件。类似地,“clover”配置文件可以重命名为“site”,您可以在该配置文件中定义其他报告,例如JDepend、JXR、PMD插件的配置。

    我认为这是像Maven一样的re:declarative(“-p fitnesse”而不是fitnesee:remotecall等)。在CI服务器上也只指定一次生成命令。最后,目的是不需要这些配置文件