Java 在Maven中,模块是否受到存储库的影响;什么是最新政策?
让我给出一个场景。您有一个多模块项目和一个部署该项目的持续集成服务器。这将部署到本地Java 在Maven中,模块是否受到存储库的影响;什么是最新政策?,java,maven,Java,Maven,让我给出一个场景。您有一个多模块项目和一个部署该项目的持续集成服务器。这将部署到本地settings.xml具有updatePolicy的always存储库中。现在,假设您在CI部署项目后立即运行mvn compile 您最终会针对远程服务器的模块或您的本地模块进行编译吗? 换句话说,存储库的updatePolicy是否对模块标记有任何影响 模块标记是一个聚合。它与依赖项的处理方式不同。请注意,在依赖项和模块中指定的值不同。当您声明一个依赖项时,您可以指定。对于模块,您可以指定 您最终会针对远程
settings.xml
具有updatePolicy
的always
存储库中。现在,假设您在CI部署项目后立即运行mvn compile
您最终会针对远程服务器的模块或您的本地模块进行编译吗?
换句话说,存储库的
updatePolicy
是否对模块
标记有任何影响 模块
标记是一个聚合。它与依赖项
的处理方式不同。请注意,在依赖项
和模块
中指定的值不同。当您声明一个依赖项时,您可以指定。对于模块
,您可以指定
您最终会针对远程服务器的模块或本地模块进行编译吗
如果在聚合器模块(而不是子模块!)中运行mvn compile
,并且子模块依赖关系是同级依赖关系,则始终会针对本地模块进行编译。当您在聚合器模块中mvn compile
时,它在编译子模块时的依赖项查找将是特殊的。它将仅从同级模块目标文件夹查看。我找不到这方面的文档,但你可以试试
假设您有这些聚合器pom
...
<modules>
<module>child-a</module>
<module>child-b</module>
</modules>
....
。。。
儿童a
儿童b
....
child-b pom正在声明对child-a的依赖关系。(确保您有一个真实的输出类)
接下来,当您mvn编译
聚合器pom时,child-b将能够编译,即使您之前没有mvn安装
child-a。这意味着,child-a甚至不在本地存储库中。这是可能的,因为maven将为类查找child-a的目标文件夹。要确认这一点,您可以尝试运行mvn compile clean
(是,编译后清除)
请再次注意,此行为仅在从聚合器pom运行时适用。如果您当前的工作目录是child-b(它依赖于child-a),那么当它尝试查找child-a时,它将遵守更新策略。关于的一点,编译子模块时的依赖项查找将是特殊的。它将仅从同级模块目标文件夹查看
。我相信Maven总是先解决反应堆内部的依赖关系。只有在reactor中没有这种依赖关系时,它才会从repo中查找。我不确定它是否在doc中有明确的描述(我相信有),但这也是直截了当的,因为当我简单地执行mvn compile
时,如果它不这样工作,那将是一团混乱。不幸的是,这是mvn compile
的当前行为。您所说的对mvn安装是正确的。为了进一步确认这一点,我们可以尝试对这两个命令使用-X来运行它们mvn compile
X中的类路径是:child-b\target\classes,child-a\target\classesmvn安装
classpath在-X中是:child-b\target\classes、.m2\child-a\1.0-SNAPSHOT\child-a-1.0-SNAPSHOT.jar。我猜如果您使用compile
,maven不能假设child-a.jar将位于任何存储库中,因此它使用child-a\target\classes代替。我更愿意以相反的方式思考:因为您使用的是install,因此maven知道依赖项将安装到本地repo,即使它是当前项目中的一个模块。这使得指向本地回购协议中的JAR可以很好地工作。对于compile,因为依赖项(当前项目中的一个模块)不会安装在本地repo中,为了使用正确的依赖项进行构建,Maven将该模块的输出目录放在reactor.Yeap中。这就是我的意思,请参阅-X输出。投票通过了,因为这让事情更清楚了。