为啥 maven-site-plugin 总是使用 3.3 版?

Posted

技术标签:

【中文标题】为啥 maven-site-plugin 总是使用 3.3 版?【英文标题】:Why does maven-site-plugin always use version 3.3?为什么 maven-site-plugin 总是使用 3.3 版? 【发布时间】:2018-06-29 13:39:31 【问题描述】:

我遇到了maven-site plugins 3.3 java.lang.ClassNotFoundException: org.apache.maven.doxia.siterenderer.DocumentContent中描述的同样问题

我正在尝试设置 maven-site-plugin(至 3.7.1)和 maven-project-info-reports-plugin-version(至 3.0.0)的版本,如答案之一所述。我正在使用 Eclipse,因此我查看了我正在处理的 pom 文件的“有效 POM”选项卡,并且可以看到这些插件的版本是 3.7.1 和 3.0.0,正如我指定的那样。

但是,当我运行 mvn help:effective-pom 时,输出显示 maven-site-plugin 两次 - 我想要的版本是 3.7.1,另一个是 3.3 版本。当我运行 mvn site 时,输出显示它正在使用 maven-site-plugin 3.3。

所以我的问题是,对 maven-site-plugin 版本 3.3 的引用来自哪里,我该如何强制它使用 3.7.1?我已经在 pom 文件中指定了它,但它仍然使用 3.3 版。

这是我对 maven-site-plugin 的定义:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.7.1</version>
    </plugin>

顺便说一句,这是一个父 pom 文件,但它是我必须在其中引用 maven-site-plugin 或任何子 pom 文件的唯一参考。

我使用的是 maven 3.2.1 版。

【问题讨论】:

检查你的依赖树。 感谢有关 maven 依赖树的提示。我以前没有使用过它,它看起来应该告诉我哪个依赖项正在拉入意外版本的 maven-site-plugin。不幸的是,我很难从中获取我需要的信息。 您对如何使用 mvn dependency:tree 选项有任何提示吗?我目前正在使用“mvn dependency:tree -Dverbose -DoutputType=graphml”,但输出文件根本没有提到 maven-site-plugin。 它是一个完整的传递依赖树 - grep 输出? 我正在搜索输出,但我似乎没有得到完整的树。如果我是,那么我应该在某个地方看到 maven-site-plugin。我已经更改了我的 grep 语句来寻找另一个确实出现在输出文件中的 jar,它给了我我期望的输出。但是当我为 maven-site-plugin 更改为 grep 时,我什么也没找到。我想我一定是做错了什么,我没有得到一棵完整的树,并希望得到关于我的问题的建议 maven dependency:tree 命令。 【参考方案1】:

Maven 并不总是使用 maven-site-plugin 3.3 版。

事实上,site 生命周期中使用的插件版本是在 Apache Maven 项目本身的maven-core/src/main/resources/META-INF/plexus/components.xml 中指定的:

<default-phases>
  <site>
    org.apache.maven.plugins:maven-site-plugin:3.3:site
  </site>
  <site-deploy>
    org.apache.maven.plugins:maven-site-plugin:3.3:deploy
  </site-deploy>
</default-phases>

在 maven 3.1.0 之前

version 3.2

自 maven 3.1.0

version 3.3

请参阅此commit 了解更多信息。

自 maven 4.0.0

version 3.9.1

在MNG-7263之后,插件版本在SiteLifecycleProvider.java中指定:

phases.put( "site", new LifecyclePhase( "org.apache.maven.plugins:maven-site-plugin:3.9.1:site" ) );
phases.put( "site-deploy", new LifecyclePhase( "org.apache.maven.plugins:maven-site-plugin:3.9.1:deploy" ) );

问题修复

要覆盖 ma​​ven-site-plugin 版本,请将其添加到 POM 文件的 build 部分,并将 maven-project-info-reports-plugin 添加到 reporting。这是一个完整的工作示例:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany</groupId>
  <artifactId>mavenproject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <url>http://www.your.site.com/</url>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.7.1</version>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>3.0.0</version>
      </plugin>
    </plugins>
  </reporting>

</project>

然后生成项目站点:

$ mvn site 

[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< com.mycompany:mavenproject >---------------------
[INFO] Building mavenproject 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-site-plugin:3.7.1:site (default-site) @ mavenproject ---
[INFO] configuring report plugin org.apache.maven.plugins:maven-project-info-reports-plugin:3.0.0
[INFO] 15 reports detected for maven-project-info-reports-plugin:3.0.0: ci-management, dependencies, dependency-info, dependency-management, distribution-management, index, issue-management, licenses, mailing-lists, modules, plugin-management, plugins, scm, summary, team
...

【讨论】:

唉,这条建议不适用于 maven-release-plugin。此处提出的错误:issues.apache.org/jira/browse/MRELEASE-1052 您的建议还不够,我还需要添加执行:&lt;plugin&gt; &lt;artifactId&gt;maven-site-plugin&lt;/artifactId&gt; &lt;version&gt;3.9.1&lt;/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;attach-descriptor&lt;/id&gt; &lt;goals&gt; &lt;goal&gt;attach-descriptor&lt;/goal&gt; &lt;/goals&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt;

以上是关于为啥 maven-site-plugin 总是使用 3.3 版?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 liquibase 总是使用自己的序列?

为啥 TensorFlow 总是使用 GPU 0?

为啥 ubiquityIdentityToken 总是为零?

为啥Sql Indexed View总是使用聚集索引

谁能告诉我为啥我们总是在机器学习中使用高斯分布?

为啥基本身份验证总是使用 restTemplate 给出错误 403?