Maven 原型的离线缓存

Offline Caching of Maven Archetypes

我希望能够在离线时从 Maven 原型启动项目。但是我找不到关于如何缓存 Maven 原型以供离线使用的明确说明。有人有什么建议吗?

Maven 原型毕竟是一个工件,因此它会在第一次使用时由 Maven 自动缓存。以后的使用总是 运行 首先获取工件(从本地缓存)。我们也可以强制 Maven 只使用缓存(离线模式,如下所述)。

因此您可以简单地调用一次相关原型(即对于一个虚拟项目)并让它们离线以供进一步调用。

如果您真的想预先缓存它,您可以使用 Maven Dependency Plugin and its get 目标将原型工件添加到本地 Maven 缓存中。

例如,让我们缓存 Maven Quickstart Archetype 如下:

mvn dependency:get -DgroupId=org.apache.maven.archetypes \
   -DartifactId=maven-archetype-quickstart -Dversion=1.0

因此它将在您的本地 Maven 缓存中存储 maven-archetype-quickstart-1.0.jar 工件。

如果您不知道本地 Maven 缓存在哪里,您可以使用 Maven Help Plugin 和 运行:

mvn help:evaluate -Dexpression=settings.localRepository

作为详细输出的一部分,您将获得本地 Maven 缓存的完整路径。

由于现在 QuickStart 原型在我们的缓存中,我们可以 运行 它使用 -o 标志(离线,强制)进行 Maven 调用

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \ 
  -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.0 \
  -DgroupId=com.sample -DartifactId=test -Dversion=1.0-SNAPSHOT -B -o

因此,Maven 将运行 离线执行并且仅使用其本地缓存。


请注意,您也可以在调用 archetype:generate 时使用 archetypeCatalog 选项并将其设置为 local 以仅检查本地目录,但强制执行到离线模式(-o) 会更好地满足您的需要(强制使用本地目录和本地缓存原型)。

Maven 的原型机制依赖于目录。目录是 Maven 检查以查看哪些原型可用的 XML 文件。 作为Maven: The complete reference states in Chapter 12.4

An Archetype catalog is an XML file which the Maven Archetype plugin can consult to locate archetypes in a repository.

您可以通过爬取本地存储库中的可用原型来创建缓存原型(已下载)的目录。这是通过调用 crawl mojo:

mvn archetype:crawl

这将在 ~/.m2/repository/archetype-catalog.xml 中创建一个 XML 文件。 (您可以通过附加 -Dcatalog=<filename>指定路径

创建后,可以使用命令

mvn archetype:generate -DarchetypeCatalog=file://<fullpath of catalog file> 

例如

mvn archetype:generate -DarchetypeCatalog=file:///home/username/.m2/repository/archetype-catalog.xml 

使用新创建的目录生成项目。它将 向您显示可用的(缓存的)原型,这些原型可以离线使用。

附录:

我猜你会更频繁地使用 mvn archetype:generate,所以你可能希望使用这个来减少输入:

1) 在.m2/archetype-catalog.xml-

下生成XML原型目录
mvn archetype:crawl -Dcatalog=/home/<username>/.m2/archetype-catalog.xml

2) 使用 mvn archetype:generate -DarchetypeCatalog=local (这会访问 .m2/archetype-catalog.xml

mvn archetype:generate -DarchetypeCatalog=local

在线使用它是个好主意,这样所有必要的插件都被下载了。例如,Archetype Plugin 和可能的其他人。