maven - 使用 Maven Ant Task 将 jar 部署到 Nexus
问题描述
我要在这里彻底疯了。我只是尝试使用 Maven Ant Task 将 jar 上传到 Nexus 服务器,但是当我使用 ant 运行 build.xml 文件时出现以下错误
Deploying to http://nexus.xxxx.co.uk:8081/repository/maven-snapshots/
[INFO] Retrieving previous build number from snapshot
Uploading: com/xxx/xxx-yyy-zzz/3.0.0-SNAPSHOT/xxx-yyy-zzz-3.0.0-SNAPSHOT.jar to repository snapshot at http://nexus.xxxxx.co.uk:8081/repository/maven-snapshots/
Transferring 1091K from snapshot
Error writing to server
An error has occurred while processing the Maven artifact tasks.
Diagnosis:
Error deploying artifact 'com.xxx-yyy-zzz': Error deploying artifact: Error transferring file
Error writing to server
这就是我的 build.xml 文件的样子
<project name="deploy" default="mvn-deploy" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
<path id="maven-ant-tasks.classpath" path="lib/maven-ant-tasks-2.1.3.jar"/>
<typedef resource="org/apache/maven/artifact/ant/antlib.xml"
uri="antlib:org.apache.maven.artifact.ant"
classpathref="maven-ant-tasks.classpath"/>
<artifact:remoteRepository id="snapshot" url="http://nexus.xxxx.co.uk:8081/repository/maven-snapshots/">
<releases enabled="false"/>
<snapshots enabled="true"/>
</artifact:remoteRepository>
<target name="mvn-deploy">
<artifact:deploy file="/path/to/jar/xxx-yyy-zzz-3.0.0-SNAPSHOT.jar"
uniqueVersion="false">
<remoteRepository refid="snapshot">
<authentication username="username" password="password"/>
</remoteRepository>
<pom file="/path/to/pom/pom.xml"/>
</artifact:deploy>
</target>
</project>
我想我已经阅读了每一篇博客文章/stackoverflow 文章、ant 文档页面,但仍然无法弄清楚为什么这不起作用。
在 Nexus 服务器上,这是日志显示的内容 (request.log)
77.101.44.67 - - [16/Apr/2020:12:08:03 +0000] "PUT /repository/maven-snapshots/com/xxx/xxx-yyy-zzz/3.0.0-SNAPSHOT/xxx-yyy-zzz-3.0.0-20200416.120803-3.jar HTTP/1.1" 401 1117368 0 1 "maven-artifact/2.2.1 (Java 1.8.0_31; Mac OS X 10.13.6)" [qtp615812221-41545]
77.101.44.67 - - [16/Apr/2020:12:08:03 +0000] "PUT /repository/maven-snapshots/com/xxx/xxx-yyy-zzz/3.0.0-SNAPSHOT/xxx-yyy-zzz-3.0.0-20200416.120803-3.jar HTTP/1.1" 401 1117368 0 1 "maven-artifact/2.2.1 (Java 1.8.0_31; Mac OS X 10.13.6)" [qtp615812221-41531]
从日志中可以看出,我收到了 401 HTTP 响应代码,这意味着未经授权。此外,上面日志行中的第三个参数应该显示用户名,因此这种倾向于 ant 在上传文件时不传递用户名和密码,并且由于您需要凭据来上传文件而失败。
它的 defo 不是 Nexus 配置问题或 nexus 用户权限问题,因为如果我使用 maven 并运行
mvn deploy
使用相同的信息,它可以毫无问题地上传 jar
在我没有头发之前,任何建议都将不胜感激......
解决方案
所以这里的所有功劳都必须归功于@user944849,让我知道maven ant任务现在实际上已经按照网站退休了
在页面的顶部,它清楚地表明它已退休,并且它已被 Maven Artifact Resolver Ant Tasks 取代。所以我试了一下,就像先行的魔法一样。
我还让它处理将快照和发布发送到正确的存储库。这由您链接的 pom 和项目版本处理,SNAPSHOT 版本转到快照存储库,非 SNAPSHOT 版本转到发布存储库
对于任何发现这个的人,这是我创建和使用的 build.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:resolver="antlib:org.apache.maven.resolver.ant">
<taskdef uri="antlib:org.apache.maven.resolver.ant" resource="org/apache/maven/resolver/ant/antlib.xml">
<classpath>
<fileset dir="lib" includes="maven-resolver-ant-tasks-1.2.0-uber.jar"/>
</classpath>
</taskdef>
<resolver:authentication username="user" password="pass" id="auth"/>
<resolver:remoterepo id="ossrh" url="http://nexus.xxxx.co.uk:8081/repository/maven-snapshots/"
type="default" releases="false" snapshots="true" updates="always" checksums="fail">
<resolver:authentication refid="auth"/>
</resolver:remoterepo>
<resolver:remoterepo id="rao" url="http://nexus.xxxxx.co.uk:8081/repository/maven-releases/">
<resolver:releases enabled="true" updates="daily" checksums="warn"/>
<resolver:snapshots enabled="false"/>
<resolver:authentication refid="auth"/>
</resolver:remoterepo>
<resolver:remoterepos id="all">
<resolver:remoterepo refid="ossrh"/>
<resolver:remoterepo refid="rao"/>
</resolver:remoterepos>
<resolver:artifacts id="producedArtifacts">
<resolver:artifact file="/path/to/jar/xxx-yyy-zzz-3.0.0-SNAPSHOT.jar"/>
</resolver:artifacts>
<resolver:pom file="/path/to/pom/pom.xml" id="pom"/>
<target name="deploy">
<resolver:deploy artifactsref="producedArtifacts">
<resolver:remoterepo refid="rao"/>
<resolver:snapshotrepo refid="ossrh" />
</resolver:deploy>
</target>
</project>
这里唯一的主要问题是文件顶部的 taskdef 需要用于 maven resolver ant 任务的 jar。我发现当我运行我的构建文件时,maven central 中的那个给了我依赖错误,所以我所做的是从网站下载源代码,然后我运行
mvn package -DskipTests=true
我运行跳过测试的原因是某些测试由于某种原因失败了,我想您可以尝试找出原因并删除该开关。
您会在目标目录中找到 Uber jar,将其复制到您的 lib 目录中,然后一切都像魔术一样工作。
安宁快乐:)
推荐阅读
- python - 如何在 Python 中获得以下输出并在输入中添加换行符?
- button - 计数按钮按下 javafx
- reactjs - React - 使用链接并将数据传递给新组件
- python - python脚本的repin函数不起作用
- azure-timeseries-insights - Azure TSI aggregateSeries 查询返回绘图不一致的数据
- nginx - 阻止直接 haproxy ip
- javascript - javascript中的javascript输入问题
- python - 熊猫弃用警告 to_dict()
- java - Spring Boot + Elastic Search + 排除类字段
- ios - 带有 React Native 的 iOS 模拟器上无法识别的字体系列“Saman”