当前位置: 首页 > 知识库问答 >
问题:

使用gradle从nexus服务器复制最新的jar文件

南门洋
2023-03-14

我正在尝试使用Gradle从Nexus服务器复制最新的jar文件(com.bar.baz:mapping:0.0.1-snapshot)。

apply plugin: "java"

repositories {
    maven {
        credentials  {
            username = "${mavenUser}"
            password = "${mavenPassword}"
        }
        url "https://nexus.cluster.foo.cloud/repository/maven-snapshots"
        authentication {
            basic(BasicAuthentication)
        }
    }
}

configurations {
    copyConf
}

dependencies {
    copyConf group: "com.bar.baz", name: "mapping", version: "0.0.1-20190508.085532-7"
}

task copyTask(type: Copy) {
    from configurations.copyConf
    into "."
}

使用版本“latest.integration”而不是“0.0.1-20190508.085532-7”(并调用Gradle copyTask--refresh-dependencies--stacktrace)将得到:

FAILURE: Build failed with an exception.

* What went wrong: Could not resolve all files for configuration ':copyConf'.
> Could not find any matches for com.bar.baz:mapping:latest.integration as no versions
of com.bar.baz:mapping are available.   Searched in
the following locations:
      https://nexus.cluster.foo.cloud/repository/maven-snapshots/com/ba/baz/mapping/maven-metadata.xml
      https://nexus.cluster.foo.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1-SNAPSHOT/maven-metadata.xml
      https://nexus.cluster.foo.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1-SNAPSHOT/mapping-0.0.1-20190508.085534-8.pom
      https://nexus.cluster.foo.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1-SNAPSHOT/mapping-0.0.1-20190508.085534-8.jar
Required by:
      project :

* Try: Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException:
Could not resolve all files for configuration ':copyConf'.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:918)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1600(DefaultConfiguration.java:116)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:892)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getFiles(DefaultConfiguration.java:404)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getFiles(Unknown
Source)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileTreeConverter.convertInto(DefaultFileCollectionResolveContext.java:206)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:116)
…

更新:

使用版本“0.0.1-snapshot”而不是“0.0.1-20190508.085532-7”(并调用Gradle CopyTask--Refresh-Dependencies--StackTrace)会产生几乎相同的错误,唯一的区别是:

>

  • 第2行改为:

    找不到com.bar.baz:映射:0.0.1-快照。

    位置https://nexus.cluster.foo.cloud/repository/maven-snapshots/com/ba/baz/mapping/maven-metadata.xml中没有搜索

    使用版本“0.0.1”而不是“0.0.1-20190508.085532-7”(并调用Gradle copyTask--Refresh-Dependencies--StackTrace)将得到:

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Could not resolve all files for configuration ':copyConf'.
    > Could not resolve com.bar.baz:mapping:0.0.1.
      Required by:
          project :
       > Could not resolve com.bar.baz:mapping:0.0.1.
          > Could not get resource 'https://nexus.cluster.regulator.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1/mapping-0.0.1.pom'.
             > Could not GET 'https://nexus.cluster.regulator.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1/mapping-0.0.1.pom'. Received status code 400 from server: Bad Request
    
    * Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':copyConf'.
            at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:918)
    ...
    

    另一个更新:

    使用maven从nexus服务器复制最新的jar文件确实有效,使用以下pom.xml:

    <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.bar.baz</groupId>
      <artifactId>TAndMapping</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>${project.artifactId}</name>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mapping>mapping</mapping>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
              <execution>
                <id>copy</id>
                <phase>package</phase>
                <goals>
                  <goal>copy</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <artifactItems> 
                <artifactItem>
                  <groupId>com.bar.baz</groupId>
                  <artifactId>${mapping}</artifactId>
                  <version>0.0.1-SNAPSHOT</version>
                  <type>jar</type>
                  <overWrite>true</overWrite>
                  <destFileName>${mapping}.jar</destFileName>   
                </artifactItem>
              </artifactItems>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </plugin> 
        </plugins>
      </build>
      <repositories>
        <repository>
          <id>nexus-snapshots</id>
          <name>Snapshot</name>
          <url>https://nexus.cluster.regulator.cloud/repository/maven-snapshots/</url>
        </repository>
      </repositories>
    </project>
    

    另一个更新:切换到Gradle5.4.1,我得到了一些不同的stacktraces:

      null
      null

    对于版本0.0.1:

      null

    另一个更新:由于@Louis Jacomet的回答,我更详细地查看了我们的Nexus服务器,当前,.../com/bar/baz/mapping/0.0.1-snapshot/maven-metadata.xml列出了:

    <metadata modelVersion="1.1.0">
    <groupId>com.bar.baz</groupId>
    <artifactId>mapping</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <versioning>
      <snapshot>
        <timestamp>20190516.163117</timestamp>
        <buildNumber>2</buildNumber>
      </snapshot>
      <lastUpdated>20190516163117</lastUpdated>
      <snapshotVersions>  
        <snapshotVersion>
          <extension>jar</extension>
          <value>0.0.1-20190516.163116-1</value>
          <updated>20190516163117</updated>
        </snapshotVersion>
        <snapshotVersion>
          <extension>pom</extension>
          <value>0.0.1-20190516.163116-1</value>
          <updated>20190516163117</updated>
        </snapshotVersion>
      </snapshotVersions>
    </versioning>
    </metadata>
    

    因此,gradle在https://nexus.cluster.regulator.cloud/repository/maven-Snapshots/com/bar/baz/mapping/0.0.1-snapshot/mapping-0.0.1-20190516.163117-2.jar中进行搜索。它找不到它,因为Nexus服务器上唯一可用的版本是版本0.0.1-20190516.163116-1。我不明白为什么会这样,我猜这是一个Nexus bug而不是Gradle bug。但是,通过Maven进行复制(请参阅pom.xml的第二次更新)仍然可以在Nexus上找到0.0.1快照版本并下载它。

  • 共有1个答案

    甄永年
    2023-03-14

    看来你要

    org.gradle.internal.resource.transport.http.HttpErrorStatusCodeException: Could not GET 'https://nexus.cluster.regulator.cloud/repository/maven-snapshots/com/bar/baz/mapping/0.0.1/mapping-0.0.1.pom'. Received status code 400 from server: Bad Request
    

    鉴于此,最有可能的解释是存储库的配置是错误的。检查为Maven设置的身份验证类型,或者在接受到Nexus实例的连接之前检查您的内部组织是否进行了其他检查。

    因此很明显,Nexus中的maven-metadata.xml文件与Gradle解析的内容不匹配。

    if ("metadata/versioning/snapshot/timestamp".equals(getContext())) {
        mavenMetadata.timestamp = getText();
    }
    if ("metadata/versioning/snapshot/buildNumber".equals(getContext())) {
        mavenMetadata.buildNumber = getText();
    }
    if ("metadata/versioning/versions/version".equals(getContext())) {
        mavenMetadata.versions.add(getText().trim());
    }
    

    有两种选择:

    1. 发布另一个快照,并查看这是否解决了maven-metadata.xml不一致性。
    2. 针对Gradle提出问题,要求改善对这些角落案例的支持
     类似资料:
    • subproject_c中的gradle文件将subproject_a和subproject_b生成的jar复制到自己的libs文件夹中进行编译。 文件被复制(也就是说,jar文件的名称显示在subproject_c的libs文件夹中),但它们完全是空的。 这是subproject_cgradle文件中进行复制的部分。

    • 我必须从FTP服务器下载最新文件。我知道如何从我的计算机下载最新文件,但我不知道如何从FTP服务器下载。 如何从FTP服务器下载最新文件? 这是我从电脑上下载最新文件的程序 好的,使用此代码我知道最后一个文件的日期,但我如何知道这个文件的名称?????????

    • 试图从jcifs转移到jcifs-ng(最新的jar jcifs-ng-2.1.2.jar)以将文件复制到/从远程。我使用旧JCIFS的代码: 在stackoverflow中找到的示例很少,但看起来它们已经过时了。

    • 问题内容: 我想编写连接到我的大学SFTP服务器的脚本,并通过练习下载最新文件。到目前为止,我已经从Paramiko示例中更改了一些代码,但是我不知道如何下载最新文件。 这是我的代码: 问题答案: 使用而不是来获得具有属性(包括文件时间戳记)的列表。 然后,找到具有最大属性的文件条目。 代码如下:

    • 问题描述: 我正在使用Gradle Shade插件,它一切正常,它将资源文件复制到最终的jar。但是,正如文档所说,它不能包含其他文件作为资源,因为它无法将它们与依赖项区分开来。它解压缩它们是ntead。 我想做的是:我想复制额外的代码。jar

    • 我试图从客户端复制文件到服务器,在Java,像这样: 客户: 服务器: 当我跑步时,我得到: 但什么都没发生。这是我第一次使用客户机服务器,我不确定自己出了什么问题。 请帮帮忙。谢谢你。