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.xml
或 site_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.xml
和 site.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.xml
和 src/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
在使用 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.xml
或 site_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.xml
和 site.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.xml
和 src/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