无法在 eclipse 中读取 maven 项目:对于输入字符串 "US"

Failed to read maven project in eclipse: For Input String "US"

我在 Eclipse (Neon 2) 中有一个 Maven 项目。

我的那个特定项目的 pom.xml 出现错误。每当我在 eclipse 中打开 pom 文件时,“错误日志”选项卡中都会抛出一条错误消息。消息是这样的 --> 无法读取 Maven 项目:对于输入字符串:"US".

双击错误显示完整的错误消息:

java.lang.NumberFormatException: For input string: "US"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at org.apache.maven.artifact.repository.MavenArtifactRepository.decode(MavenArtifactRepository.java:314)
    at org.apache.maven.artifact.repository.MavenArtifactRepository.basedir(MavenArtifactRepository.java:246)
    at org.apache.maven.artifact.repository.MavenArtifactRepository.<init>(MavenArtifactRepository.java:80)
    at org.apache.maven.bridge.MavenRepositorySystem.createArtifactRepository(MavenRepositorySystem.java:467)
    at org.apache.maven.bridge.MavenRepositorySystem.buildArtifactRepository(MavenRepositorySystem.java:387)
    at org.apache.maven.project.DefaultProjectBuilder.initProject(DefaultProjectBuilder.java:863)
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:176)
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:119)
    at org.apache.maven.project.DefaultProjectBuilder.initProject(DefaultProjectBuilder.java:679)
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:176)
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:119)
    at org.eclipse.m2e.core.internal.embedder.MavenImpl.readMavenProject(MavenImpl.java:636)
    at org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager.call(ProjectRegistryManager.java:816)
    at org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager.call(ProjectRegistryManager.java:1)
    at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:176)
    at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:151)
    at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:99)
    at org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager.execute(ProjectRegistryManager.java:967)
    at org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager.readProjectWithDependencies(ProjectRegistryManager.java:811)
    at org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager.create(ProjectRegistryManager.java:192)
    at org.eclipse.m2e.core.internal.project.registry.MavenProjectManager.create(MavenProjectManager.java:80)
    at org.eclipse.m2e.core.ui.internal.actions.SelectionUtil.getMavenProject(SelectionUtil.java:259)
    at org.eclipse.m2e.editor.pom.MavenPomEditor.readMavenProject(MavenPomEditor.java:732)
    at org.eclipse.m2e.editor.pom.MavenPomEditor.run(MavenPomEditor.java:1053)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

我仍然能够执行 mvn clean/install 等...但是在您的项目中不断看到 pom 错误真是令人讨厌。我不想简单地更改 maven 或 eclipse 中的某些内容来隐藏错误我想了解它为什么会发生以及修复它的最佳方法是什么。

这里抛出错误:

at org.apache.maven.artifact.repository.MavenArtifactRepository.decode(MavenArtifactRepository.java:314)

查看 MavenArtifactRepository 的 source code,我 认为 您在 pom.xmlsettings.xml 中定义了一个存储库无效 URL(使用字符串 US)。

  • 查看您的 pom.xml 或父 pom;
  • 看看 settings.xml(通常在 ~/.m2 中,尽管您可能已经覆盖了它在 Eclipse 中的位置);
  • 也许这是在 Eclipse 中配置的某个存储库,您可以通过 Eclipse 配置文件对您的 Eclipse 工作区进行全面搜索。

MavenArtifactRepository的相关源代码(阅读javadoc注释):

/**
 * Create a remote download repository.
 * @param url the URL of the repository
*/
public MavenArtifactRepository(..., String url, ...) {
    ...
    this.basedir = basedir( url );
}


/**
 * Derive the path portion of the given URL.
 * @param url the repository URL
*/
private String basedir( String url ) {
    if ( protocol.equalsIgnoreCase( "file" ) ) {
        retValue = url.substring( protocol.length() + 1 );
        retValue = decode( retValue );
    ...
}

/**
 * Decodes the specified (portion of a) URL. <strong>Note:</strong> This decoder assumes that ISO-8859-1 is used to
 * convert URL-encoded bytes to characters.
 *
 * @param url The URL to decode, may be <code>null</code>.
 * @return The decoded URL or <code>null</code> if the input was <code>null</code>.
 */
private static String decode( String url )
{
    String decoded = url;
    if ( url != null )
    {
        int pos = -1;
        while ( ( pos = decoded.indexOf( '%', pos + 1 ) ) >= 0 )
        {
            if ( pos + 2 < decoded.length() )
            {
                String hexStr = decoded.substring( pos + 1, pos + 3 );
                char ch = (char) Integer.parseInt( hexStr, 16 );
                decoded = decoded.substring( 0, pos ) + ch + decoded.substring( pos + 3 );
            }
        }
    }
    return decoded;
}

如果我没看错代码,你的存储库可能看起来像这样:

file:anything%USanything

显然(根据代码),只有有效的 2 位十六进制数 应该跟在 url...[=20= 中的“%”符号之后]