这是一个非常罕见的用例,但有时您需要它。 如何将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