1

默认情况下,Maven 将从本地存储库(.m2 目录)中获取所有依赖项。但相反,我希望它从另一个位置获取依赖项。这甚至可能吗?

我不想对所有事情都这样做。我不希望这发生在“根”或父级。我希望这发生在更“更深”的 pom 级别。不止一次,同一个依赖是依赖。每次,我都希望它来自不同的位置。因此,一个将使用默认的 maven 配置并从 .m2 目录中获取它,而另一个将从特定目录中获取它。


我的理由:

在安装阶段,所有内容都安装到 .m2 目录中。在打包阶段,我将所有内容打包到目标目录中。(我说的不对吗?)

我的 .m2 目录比需要的要多。我的目标有我的最终项目,没有包含在 .m2 目录中的额外“东西”。目标目录中的任何内容都是最终产品。当我处于编译阶段时,我不希望它依赖于 .m2 目录,而是依赖于目标,因为那是我真正的最终项目。


我在 Linux (Red Hat) 上使用 Maven 2.2.1。

我在某处读过,您可以在文件中的元素下使用<scope>具有值系统<dependency>元素pom.xml<systemPath>然后在 that 下调用的另一个元素中给出实际位置<dependency>。我不回答我的问题,或者这完全不同。

我知道这违背了 Maven 的建议,但我有我的理由。

4

2 回答 2

2

请先阅读我对这个不同但相关的问题的回答。

一般来说,当谈到 Maven 时,人们已经发展了肌肉记忆。举个例子,几乎每个人都认为这是使用 Maven 构建项目的方式:

$ mvn clean install

现在它将构建项目,但它还将构建的工件存储在本地存储库中..,如果您随后要处理子模块并希望始终安全地重建所有内容,或者如果您是使用对反应器了解不足的 IDE(大多数 IDE 的较新版本没有此问题)

你可能应该做的是

$ mvn clean verify

或者

$ mvn clean package -DskipTests

(第二个跳过测试,因为如果您不关心确保集成测试通过,您可能也不关心单元测试)

所以对我来说,听起来你只是输入了错误的命令......

现在还有第二种可能性,即您可能正在构建一个不作为传递依赖项公开的“瞬态、中间”工件……在这种情况下,您可以<skip>true</skip>在特定的 maven-install-plugin 的配置中添加一个模块(也可以考虑添加到 maven-deploy-plugin),但你需要确保模块不会通过传递依赖泄漏,否则一切都会崩溃。

于 2013-01-23T09:26:43.347 回答
0

转到您的 Maven 安装目录,让我们说C:\apache-maven-2.2.1. 遍历bin目录编辑m2.conf。默认设置是

set maven.home default set maven.home default ${user.home}/m2

根据需要更改此设置。

于 2013-01-22T16:08:11.630 回答