1

我有一个开源操作系统项目的需求,在nix环境下完全离线使用Maven。即它应该使用系统中可用的依赖项(可能在 /usr/share/ + 其他几个地方?)。Maven 不应从 Internet 下载任何依赖项。

有没有解决方案来实现这一目标?在系统中创建 M2 存储库不是一个可行的解决方案。问题是文件系统是只读的。我们只能处理具有写入权限的临时文件夹(例如 /tmp)。但是在临时位置维护一个 repo 是一个糟糕的设计,不是吗?换句话说,新安装的 maven 项目应该使用系统中现有的包(如果可用)。如果包不存在,则应单独安装(通过包管理器),并且不应将其复制到 m2 存储库。

有什么已知的方法可以做到这一点吗?

谢谢您的帮助!

PS:请注意,我不是在询问 -o 选项以使其脱机!

4

3 回答 3

1

您可以创建自己的“镜像”存储库(/tmp 上实际 Maven 存储库的镜像)并要求 Maven 使用它而不是远程存储库。

例子 :

http://maven.apache.org/guides/mini/guide-mirror-settings.html

于 2011-03-28T02:08:12.370 回答
0

我认为您可以创建一个本地 maven 存储库(具有正确的文件夹树和 pom 文件),但在只写目录中使用指向 jar 的符号链接。当然这个解决方案并不比 Shamit Verma 的方法更容易,你必须编写一些代码。

于 2011-03-28T15:34:15.410 回答
0

我们使用的方法如下。我们已决定将 m2 存储库存储在 /usr/share/maven-2/maven_home/m2_repo/。这不是临时文件夹,需要管理员权限才能写入。但这不是问题,因为安装包也需要管理员权限。

我们已将 repo 中的 jar 符号链接到系统级 jar。即我们维护了 maven 存储库结构,但是 jar 被符号链接到系统 jar。这意味着没有不必要的重复和空间浪费。我们仍然将 pom 文件保存在 repo 中。pom 文件由 python 脚本重写以满足我们的需求。此外,我们使用系统范围来引用依赖项。例如,

<dependency>
  <groupId>groupId</groupId>
  <artifactId>artifactId</artifactId>
  <version>666</version>
  <scope>system</scope>
  <systemPath>/usr/share/maven-core/lib/maven-core.jar</systemPath>
</dependency>

对于系统范围,groupId:artifactId:version 组合无关紧要。它只是挑选它找到的罐子<systemPath>

于 2011-08-21T16:48:06.163 回答