这是一个非常罕见的用例,但有时您需要它。 如何在应用程序中嵌入Maven,以便可以以编程方式运行目标?
简短的答案是:这很棘手。 我涉足了我的java webapp自动同步项目的问题 ,有时我决定不嵌入它。 最终,我使用了可以满足我需要的库,但是无论如何,以下是可能有用的步骤和工具。
通常,嵌入式Maven需要的是在Maven项目中执行一些目标。 有两种情况。
第一个是,如果您正在Maven容器中运行,即正在编写Mojo /插件。 然后,这很容易,因为您可以通过已初始化的plexus容器管理所有内容。 在这种情况下,您可以使用mojo-executor 。 易于使用,但是需要一个“项目”,“ pluginManager”和“会话”,您无法轻松获得它们。
第二种情况是完全嵌入的Maven。 有一个图书馆可以满足我的需要(感谢MariuszS指出了这一点)–它是Maven Embedder 。 此SO问题中描述了它的用法。 使用第一个和第二个答案。
在找到该库之前,我尝试了另外两个库: jenkins maven Embedded和Maven Invoker 。 这两个库中的问题是:它们需要一个maven家。 即,maven安装所在的路径。 这有点与“嵌入式”专家的想法相反。 如果Maven Embedder适合您,则可以停止阅读。 但是,在某些情况下,Maven Embedder可能不是您想要的。 在这种情况下,您应该使用上述两个库之一。 那么,如何找到并设置行家呢?
- 要求用户指定它。 可能不太麻烦
- 使用M2_HOME。 其中一个库默认情况下使用该库,但问题是可能未设置它。 例如,我通常不设置它。 如果不是这样,则可以退回到以前的方法
- 扫描整个文件系统以进行Maven安装-听起来不错,并且只能执行一次,然后存储在某个条目中。 问题是–可能没有maven安装。 即使是开发人员的机器,IDE(至少是Eclipse)都有一个“嵌入式”专家。 尽管它可能以手动安装的相同格式将其存储在内部某个位置,但它可能会根据版本而更改其路径或结构。 当然,您可以不时地重新扫描文件树以找到这样的安装
- 自己以编程方式下载Maven。 然后,您可以确定它的位置,并且始终将其以相同的格式放置在该位置。 这里的问题是版本不匹配–用户可能正在使用其他版本的maven。 使版本可配置是一种选择。
所有这些在某些情况下均有效,而在另一些情况下则无效。
因此,按照优先顺序:
- 确保您确实需要嵌入行家
- 使用Maven嵌入器
- 使用其他选项及其含义。
翻译自: https://www.javacodegeeks.com/2013/11/embedding-maven.html