6

我们有 1 个公司的父 pom。这使用dependencyManagement 来管理所有使用的工件的所有依赖项的版本。

令人震惊的是,SNAPSHOT 版本可以在dependencyManagement 中定义。虽然在执行 maven 发布时,pom 允许在依赖管理中使用 SNAPSHOT 版本发布。为什么?

如果我将子项目指向公司父 pom 的已发布版本,并且该子项目使用在 dependencyManagement 中定义的依赖项,尽管它是 SNAPSHOT 版本,我无法发布子项目。

为什么 Maven 允许发布在 dependencyManagement 中定义的工件的 SNAPSHOT 版本?如果定义了 SNAPSHOT 版本,如何配置 maven 发布插件失败?

4

2 回答 2

3

令人震惊的是,SNAPSHOT 版本可以在dependencyManagement 中定义。虽然在执行 maven 发布时,pom 允许在依赖管理中使用 SNAPSHOT 版本发布。为什么?

我希望maven-release-plugin在发布时更新 SNAPSHOT 版本dependencyManagement。实际上,有一些关于此的 Jira,例如MRELEASE-91MRELEASE-202可能会影响您。

所以问题是:您使用的是哪个版本的插件?

但老实说,目前还不清楚哪些版本受MRELEASE-202影响,评论令人困惑(所以我想知道问题是否已解决)。无论如何,如果您使用的版本受到影响,请升级到更新的版本。如果错误/回归(我认为这是一个错误)仍然存在,那么提出一个新问题。

于 2010-01-19T07:38:15.690 回答
0

我没有关于“为什么”的答案(我个人认为这是一个错误),但我有办法防止这种情况发生:使用 Maven Enforcer 插件。

一家名为smartics(小写 s)的公司创建了一个规则(NoSnapshotDependenciesInDependencyManagementRule)来防止这个确切的问题。

您基本上需要将以下内容添加到您的父 POM:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-enforcer-plugin</artifactId>
  <version>1.4.1</version>
  <executions>
    <execution>
      <id>enforce-project-rules</id>
      <phase>test</phase>
      <goals>
        <goal>enforce</goal>
      </goals>
      <configuration>
        <rules>
          <NoSnapshotDependenciesInDependencyManagementRule
            implementation="de.smartics.maven.enforcer.rule.NoSnapshotsInDependencyManagementRule">
            <onlyWhenRelease>true</onlyWhenRelease>
            <checkOnlyResolvedDependencies>false</checkOnlyResolvedDependencies>
          </NoSnapshotDependenciesInDependencyManagementRule>
        </rules>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>de.smartics.rules</groupId>
      <artifactId>smartics-enforcer-rules</artifactId>
      <version>1.0.2</version>
    </dependency>
  </dependencies>
</plugin>
于 2016-06-21T07:58:05.083 回答