【问题标题】:Setting up maven to compile (instead of downloading) dependencies设置 maven 以编译(而不是下载)依赖项
【发布时间】:2016-10-28 12:01:16
【问题描述】:

我克隆了Apache ActiveMQ Artemis项目的git仓库(https://github.com/apache/activemq-artemis)然后输入

mvn -Ptests test -pl :integration-tests

我很惊讶地看到如下日志消息

...
Downloading: http://repository.apache.org/snapshots/org/apache/activemq/artemis-selector/1.4.0-SNAPSHOT/artemis-selector-1.4.0-20160625.030221-11.jar
Downloading: http://repository.apache.org/snapshots/org/apache/activemq/artemis-core-client/1.4.0-SNAPSHOT/artemis-core-client-1.4.0-20160625.030211-11.jar
...

因为例如artemis-core-client 包含在我一开始克隆的 git 存储库中,我预计 maven 只是从那里构建它。

这样,当我在核心客户端源中进行更改时,它们会被集成测试拾取。

相反,maven 正在从存储库下载 jar。

问题:如何配置 maven 以始终构建 git 存储库中的所有模块并仅下载“真实”依赖项,即不在 git 存储库中的东西?

【问题讨论】:

  • 本质上,这与这个问题相同:stackoverflow.com/questions/33131880/… 您应该从根项目而不是直接在模块内运行 Maven。这是因为尚未安装依赖项,因此 Maven 会尝试下载它们。
  • @Tunaki 所以“-pl :integration-tests”是导致 maven 下载而不是编译的原因。正确的?因为我在主项目 .pom 文件所在的目录中运行 mvn。
  • 不,主项目中没有集成测试模块,请查看我的答案。您正在测试/主项目上执行 maven,而不是库/主项目。

标签: maven build dependency-management multi-module activemq-artemis


【解决方案1】:

您没有在主项目上执行 Maven 构建,在主 pom.xml 上确实定义了 artemis-selectorartemis-core-client 模块等。

您正在 tests 及其 pom.xml 上执行 Maven 构建,其中仅定义了测试模块。这是一个侧面/测试项目,它以之前的 pom 文件作为父项,但它在其父模块定义中没有任何作用。因此,依赖项不是作为模块解析,而是作为 Maven 依赖项解析。

你应该首先安装(通过mvn clean install)之前的项目,这样库就可以在你的本地Maven缓存中使用(因此不会触发下载),然后执行tests项目。


检查official doc 以了解继承与聚合的差异以进一步阐明它。

从 Stack Overflow,以下线程也可能很有趣:

【讨论】:

  • “你应该首先安装(通过 mvn clean install)前一个项目”,这似乎有点容易出错,因为 IMO 很容易针对不同的 jar 集运行测试而不是我想要的测试。这是 Maven 可以做的最好的事情,还是可以更好地配置项目?如果您认为有必要,我会问一个新问题。
  • @JiriDanek 这是我要说的项目选择的策略,可能是为了减少模块的数量或在不同的主项目上进行集成测试以分离关注点(不对模块进行集成测试,以对正在进行的代码不强制执行集成测试?)。作为一种不同的策略,整个测试端项目可能是主项目的配置文件,将其模块添加到整个构建中。然而,从 pom 的评论看来,整个主构建可能已经花费了 2 多个小时,所以这可能也在这个选择中发挥了作用。
  • @JiriDanek 如果这对您有所帮助,请考虑accepting 的答案,这样问题就不会在全球范围内显示为未回答。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多