java - 使用 Gradle 将 .jar 发布到私有(private) Maven

标签 java maven grails gradle

我正在将 Grails 插件(最终是 .jar)发布到私有(private) Maven 存储库,导致出现以下错误。我已多次确认凭据有效。

似乎根本没有发送凭据(未经授权 401):

Could not transfer artifact com.blah.plugins:blahCommonPlugin:pom:0.1 from/to remote (http://maven.blah.com): Could not write to resource 'com/blah/plugins/blahCommonPlugin/0.1/blahCommonPlugin-0.1.pom'
:publishMavenJavaPublicationToBlahRepository FAILED
:publishMavenJavaPublicationToBlahRepository (Thread[Daemon worker,5,main]) completed. Took 2.788 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishMavenJavaPublicationToBlahRepository'.
> Failed to publish publication 'mavenJava' to repository 'blah'
   > Failed to deploy artifacts: Could not transfer artifact com.blah.plugins:blahCommonPlugin:jar:0.1 from/to remote (http://maven.blah.com): Could not write to resource 'com/blah/plugins/blahCommonPlugin/0.1/blahCommonPlugin-0.1.jar'

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.

BUILD FAILED

Total time: 5.634 secs
Stopped 0 compiler daemon(s).
Could not PUT 'http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1/blahCommonPlugin-0.1.jar'. Received status code 401 from server: Unauthorized

在我的 build.gradle 中,我有以下内容(仅相关部分):

version "0.1"
group "com.blah.plugins"

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            name "blah"
            url "http://maven.blah.com"
        }
    }
}

//Not sure if I need this
grailsPublish {
    repo = 'blah'
    githubSlug = 'blah/blahCommonPlugin'
    title = "blahCommonPlugin"
    desc = "blahcommon plugin"
    developers = [erikahlswede:"Erik Ahlswede"]
}

然后我在我的settings.xml (~/.m2/settings.xml) 中有这个

<settings>
  <servers>
    <server>
      <id>blah</id>
      <username>un</username>
      <password>pass</password>
    </server>
  </servers>
</settings>

知道我可能会错过什么吗?

编辑 1

我暂时删除了 settings.xml 进行调试。我正在使用:

repositories {
        maven {
            name "snapshots"
            url "http://maven.blah.com/"
            credentials {
                username 'blahUser'
                password 'blahPassword'
            }
            authentication {
                basic(BasicAuthentication)
                digest(DigestAuthentication)
            }
        }
}

通过详细输出,我看到:

Using Credentials [username: blahUser] for authenticating against 'null:-1' using Digest
Using Credentials [username: blahUser] for authenticating against 'null:-1' using Basic

以下是相关日志的其余部分:

Publishing to repository org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated@457d1e38
Using Credentials [username: blahUser] for authenticating against 'null:-1' using Digest
Using Credentials [username: blahUser] for authenticating against 'null:-1' using Basic
Deploying to http://maven.blah.com/
Downloading: com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/maven-metadata.xml from repository remote at http://maven.blah.com/
Constructing external resource: http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/maven-metadata.xml
Performing HTTP GET: http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/maven-metadata.xml
Connection request: [route: {}->http://maven.blah.com][total kept alive: 0; route allocated: 0 of 5; total allocated: 0 of 10]
Connection leased: [id: 0][route: {}->http://maven.blah.com][total kept alive: 0; route allocated: 1 of 5; total allocated: 1 of 10]
Connecting to maven.blah.com:80
CookieSpec selected: best-match
Auth cache not set in the context
Target auth state: UNCHALLENGED
Proxy auth state: UNCHALLENGED
Attempt 1 to execute request
Sending request: GET /com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/maven-metadata.xml HTTP/1.1
Receiving response: HTTP/1.1 404 Not Found
Connection can be kept alive indefinitely
Connection [id: 0][route: {}->http://maven.blah.com] can be kept alive indefinitely
Connection released: [id: 0][route: {}->http://maven.blah.com][total kept alive: 1; route allocated: 1 of 5; total allocated: 1 of 10]
Resource missing. [HTTP GET: http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/maven-metadata.xml]
Could not find metadata com.blah.plugins:blahCommonPlugin:0.1-SNAPSHOT/maven-metadata.xml in remote (http://maven.blah.com/)
Uploading: com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/blahCommonPlugin-0.1-20160405.174228-1.jar to repository remote at http://maven.blah.com/
Attempting to put resource http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/blahCommonPlugin-0.1-20160405.174228-1.jar.
Upload http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/blahCommonPlugin-0.1-20160405.174228-1.jar
Performing HTTP PUT: http://maven.blah.com/com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/blahCommonPlugin-0.1-20160405.174228-1.jar
Connection request: [route: {}->http://maven.blah.com][total kept alive: 1; route allocated: 1 of 5; total allocated: 1 of 10]
Connection leased: [id: 0][route: {}->http://maven.blah.com][total kept alive: 0; route allocated: 1 of 5; total allocated: 1 of 10]
Stale connection check
CookieSpec selected: best-match
Auth cache not set in the context
Target auth state: UNCHALLENGED
Proxy auth state: UNCHALLENGED
Attempt 1 to execute request
Sending request: PUT /com/blah/plugins/blahCommonPlugin/0.1-SNAPSHOT/blahCommonPlugin-0.1-20160405.174228-1.jar HTTP/1.1
Receiving response: HTTP/1.1 401 Unauthorized
Connection can be kept alive indefinitely
Authentication required
maven.blah.com:80 requested authentication
Authorization challenge processed
Authentication failed

编辑2

尝试仅 curl 请求...似乎不起作用:

$ curl --basic -u username:password http://maven.blah.com/com/blah/plugins/blahCommonPlugin/test/api-1.0-20160128.114425-1.jar --request PUT --data blahCommonPlugin-0.1-SNAPSHOT.jar
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.6.3</center>
</body>
</html>

我找到了我们的maven服务器的nginx配置。不确定这是否配置正确。这看起来还好吗?:

# Allow only these methods (GET and HEAD are allowed by default)
dav_methods PUT MKCOL;
dav_access user:rw  group:rw  all:r;
create_full_put_path on;
...
 # For all plugins and directories
location / {
    # Allow files listing for repositories
    autoindex on;

    limit_except PUT MKCOL {
        # For GET and HEAD request use this file for username/password who have only download permissions from Maven server
        auth_basic_user_file /etc/nginx/.htpasswd/downloaders;
    }
}

最佳答案

这就是我们处理使用凭据发布到 Maven 存储库的方式:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://repo"){
                authentication(userName: "yankee", password: "doodle")
            }
            snapshotRepository(url: "http://repo-snapshotRepository"){
                authentication(userName: "yankee", password: "doodle")
            }
        }
    }
}

更多详细信息可以在这里找到: https://docs.gradle.org/current/userguide/maven_plugin.html

关于java - 使用 Gradle 将 .jar 发布到私有(private) Maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432765/

相关文章:

java - 每 30 分钟后的 Spring cron 表达式

java - Eclipse 没有完全关闭 ServerSocket

java - 关闭/隐藏 Android 软键盘和显示自定义键盘

java - 为什么 HTTP 请求不起作用?小智

java - Maven 和 Java : The parameters 'mainClass' for goal org. codehaus.mojo :exec-maven-plugin:1. 2.1:java 丢失或无效

grails 日志消息未显示在 STS 3.0 控制台上

java - 使用不同的工作目录运行项目中的所有测试

java - Maven 将依赖调解策略设置为最新而不是最近

javascript - 如何在jquery中克隆后删除输入字段

json - Grails 3.1 json 渲染