Maven 搜索 site.xml 缺失的英语语言环境

Maven searches for missing english locale of site.xml

在使用 maven 构建项目期间,我 运行 在更新其父项目的版本后生成 javadoc 时遇到问题。

2016-08-18 16:06:44.559 [INFO] <<< maven-javadoc-plugin:2.10.3:aggregate < generate-sources @ org.eclipse.scout.rt <<<
2016-08-18 16:06:44.560 [DEBUG] building maven31 dependency graph for org.eclipse.scout.rt:org.eclipse.scout.rt:pom:6.0.0-SNAPSHOT with Maven31DependencyGraphBuilder
2016-08-18 16:06:44.560 [DEBUG] Dependency collection stats: {ConflictMarker.analyzeTime=0, ConflictMarker.markTime=0, ConflictMarker.nodeCount=1, ConflictIdSorter.graphTime=0, ConflictIdSorter.topsortTime=0, ConflictIdSorter.conflictIdCount=0, ConflictIdSorter.conflictIdCycleCount=0, ConflictResolver.totalTime=0, ConflictResolver.conflictItemCount=0, DefaultDependencyCollector.collectTime=0, DefaultDependencyCollector.transformTime=0}
2016-08-18 16:06:44.561 [DEBUG] org.eclipse.scout.rt:org.eclipse.scout.rt:pom:6.0.0-SNAPSHOT
2016-08-18 16:06:44.636 [DEBUG]  canGenerateReport = true for project MavenProject: org.eclipse.scout.rt:org.eclipse.scout.rt:6.0.0-SNAPSHOT @ /home/<REDACTED>/workspace/org.eclipse.scout.rt.branch-6.0_nightly-sitedocs/org.eclipse.scout.rt/pom.xml
2016-08-18 16:06:44.662 [DEBUG] Computing decoration model of org.eclipse.scout.rt:org.eclipse.scout.rt:pom:6.0.0-SNAPSHOT for locale en
2016-08-18 16:06:44.662 [DEBUG] No site descriptor found for org.eclipse.scout.rt:org.eclipse.scout.rt:pom:6.0.0-SNAPSHOT
2016-08-18 16:06:44.663 [DEBUG] Looking for site descriptor of level 1 parent project: org.eclipse.scout:maven_rt_plugin_config-master:pom:2.0.7
2016-08-18 16:06:44.665 [DEBUG] Using transporter WagonTransporter with priority -1.0 for <REDACTED>
2016-08-18 16:06:44.666 [DEBUG] Using connector BasicRepositoryConnector with priority 0.0 for <REDACTED>
2016-08-18 16:06:44.666 [INFO] Downloading: <REDACTED>/org/eclipse/scout/maven_rt_plugin_config-master/2.0.7/maven_rt_plugin_config-master-2.0.7-site_en.xml
2016-08-18 16:06:45.289 [DEBUG] Writing tracking file /home/<REDACTED>/workspace/org.eclipse.scout.rt.branch-6.0_nightly-sitedocs/.repository/org/eclipse/scout/maven_rt_plugin_config-master/2.0.7/maven_rt_plugin_config-master-2.0.7-site_en.xml.lastUpdated
2016-08-18 16:06:45.597 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.5.1:site (default-cli) on project org.eclipse.scout.rt: SiteToolException: The site descriptor cannot be resolved from the repository: ArtifactResolutionException: Unable to locate site descriptor: Could not transfer artifact org.eclipse.scout:maven_rt_plugin_config-master:xml:site_en:2.0.7 from/to AAA.libs.release (<REDACTED>): Access denied to: <REDACTED>/org/eclipse/scout/maven_rt_plugin_config-master/2.0.7/maven_rt_plugin_config-master-2.0.7-site_en.xml , ReasonPhrase:Forbidden.
2016-08-18 16:06:45.598 [ERROR] org.eclipse.scout:maven_rt_plugin_config-master:xml:2.0.7
2016-08-18 16:06:45.598 [ERROR] 
2016-08-18 16:06:45.598 [ERROR] from the specified remote repositories:
2016-08-18 16:06:45.598 [ERROR] AAA.libs.release (<REDACTED>, releases=true, snapshots=false),
2016-08-18 16:06:45.599 [ERROR] AAA.libs.snapshots (<REDACTED>, releases=false, snapshots=true),
2016-08-18 16:06:45.599 [ERROR] eclipse.release (https://repo.eclipse.org/content/groups/releases/, releases=true, snapshots=false),
2016-08-18 16:06:45.599 [ERROR] eclipse.snapshot (https://repo.eclipse.org/content/groups/snapshots/, releases=true, snapshots=true),
2016-08-18 16:06:45.599 [ERROR] remote-repos (<REDACTED>, releases=true, snapshots=false)

如您所见,它尝试下载 maven_rt_plugin_config-master-2.0.7-site_en.xml,但实际上并不存在。然而,确实存在这样一个没有 _en 后缀的 xml...

据我所知,我没有指定语言环境,而且与网站或 javadoc 生成相关的父项目似乎没有任何变化。

为什么 Maven 不回退到默认语言环境?

此问题的原因是我们的存储库 (JFrog Artifactory) 的行为: 请求的存储库是 virtual repository,它聚合了多个物理存储库。

如果在用户有权访问的存储库中找不到请求的工件,它会回复 403(禁止访问)- 并且存在其他用户 有权访问的工件到。然后 Maven 似乎停止在同一个存储库中寻找替代文件。

JFrog Artifactory 存在一个 feature request 来改变行为,但是(在撰写本文时)没有人在研究它。

我们的解决方案是将 settings.xml 更改为直接指向存储库。然后,Maven 将收到英文语言环境版本 (site_en.xml) 的 404(未找到),并正确回退到默认值 site.xml。其他几个 Maven 插件在出现 403 时也会出现此问题。

万一这可能有助于其他人试图弄清楚为什么 maven 从父项目中搜索 site.xmlsite_en.xml 而在只想使用默认设置时却失败了:

在使用SpringBoot时遇到了类似的问题。 mvn clean site 尝试从中央 (https://repo.maven.apache.org/maven2) 传输 spring-boot-starter-parent:xml:site_en:1.4.0.RELEASE 失败:

repo.maven.apache.org:443 repo.maven.apache.org/x.x.x.x failed: Connection timed out: connect

当项目被配置为使用公司存储库时会发生这种情况,但在使用 maven central direct 时不会发生。似乎在公司存储库就位的情况下,请求被代理为安全请求。对中心的安全请求因 "time out" 而失败,构建失败。如果请求不安全,"not found" 将从中心返回,maven 将继续使用默认设置。所以在这种情况下,404 会很好(根据需要继续使用默认值)其他错误代码不好(构建失败)。

有几种解决方法:

  • 将文件安装到本地存储库(hack)
  • 公司回购服务器上的配置更改(可能是真正的修复,与接受的答案中描述的相同)
  • 在 maven settings.xml 文件中配置代理设置

这里是 settings.xml 代理配置的示例:

<proxy>
    <active>true</active>
    <protocol>http</protocol>
    <host>my.corporate.proxy</host>
    <port>myPort</port>
    <nonProxyHosts>*.my.corporate.domain|*.my.subsidiary.domain</nonProxyHosts>
</proxy>

正如在其他答案中所讨论的,当试图在远程存储库中查找与父文件关联的文件 site_en.xmlsite.xml 时出现网络问题似乎会发生这种情况。看起来如果服务器 returns 404(未找到)那么一切都很好,但是如果 HTTP 请求 returns 其他东西,那么子构建就会中止。如果您有多个远程存储库,这可能是一个特殊的问题,因为它只需要一个失败就会导致子构建失败。

如果您可以控制父项目,则可以使用变通方法 - 您可以与父 pom 一起发布虚拟文件,这样客户端构建不再依赖于获得 404。但是您需要发布这两个文件子版本正在寻找,而不仅仅是一个.

释放一个文件很容易,但释放两个文件有点麻烦。要释放这两个文件,请在父级 pom.xml 中使用 site:attach-descriptor,配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-site-plugin</artifactId>
  <executions>
    <execution>
      <id>attach-descriptor</id>
      <goals>
        <goal>attach-descriptor</goal>
      </goals>
      <configuration>
        <locales>en,de</locales>
      </configuration>
    </execution>
  </executions>
</plugin>

黑客是 locales 配置。 en 导致 site_en.xml 文件附加到构建并发布。 de 试图寻找不存在的 site_de.xml,因此代码回退到 site.xml。请注意,de 是一个随机选择的语言环境,但它确实存在,即。 xx 无效。

实际文件应与父文件一起添加 pom.xml。父项目的结构应该是:

- pom.xml
- src
  - site
    - site.xml
    - site_en.xml

这是一个适合 src/site/site_en.xmlsrc/site/site.xml 的虚拟文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Parent-Site">
</project>

PS。 attach-descriptor 目标不会继承,因此此配置不会影响子构建。

导致站点插件跳过查找丢失文件的解决方法是创建您自己的 site.xml 站点描述符,并将 combine.self 属性设置为 override:

<project name="Your-Service" combine.self="override">
    ...
</project>

此文件应位于 src/site/site.xml