Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Maven中,模块是否受到存储库的影响;什么是最新政策?_Java_Maven - Fatal编程技术网

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\classes
mvn安装
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输出。投票通过了,因为这让事情更清楚了。