Maven:尝试使用 settings.xml 文件中的凭据进行部署
Posted
技术标签:
【中文标题】Maven:尝试使用 settings.xml 文件中的凭据进行部署【英文标题】:Maven: Trying to Deploy with credentials in settings.xml file 【发布时间】:2012-08-15 22:54:54 【问题描述】:上周似乎可行,但现在不行了。
我们使用 Artifactory 作为 Maven 存储库。 我正在使用deploy:deploy-file
目标部署一个 jar 和 pom
我们的 Artifactory 存储库需要身份验证才能部署。
我可以通过在命令行的服务器 URL 中嵌入我的凭据来部署到存储库:
$ mvn deploy:deploy-file \
-Durl=http://deployer:swordfish@repo.veggiecorp.com/artifactory/ext-release-local \
-Dfile=crypto.jar \
-DpomFile=pom.xml \
-Did=VeggieCorp
yadda...yadda...yadda...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.962s
[INFO] Finished at: Mon Aug 20 10:06:04 CDT 2012
[INFO] Final Memory: 4M/118M
[INFO] ------------------------------------------------------------------------
但是,整个部署都会被记录下来,并且我的凭据会显示在日志中。因此,我希望能够在没有我的凭据的情况下在命令行上进行部署。为此,我有一个$HOME/.m2/settings.xml
文件:
<settings>
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.veggiecorp.com</host>
<port>3128</port>
<nonProxyHosts>*.veggiecorp.com</nonProxyHosts>
</proxy>
</proxies>
<servers>
<server>
<id>VeggieCorp</id>
<username>deployer</username>
<password>swordfish</password>
</server>
</servers>
<profiles>
<profile>
<id>VeggieCorp</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>VeggieCorp</id>
<name>VeggieCorp's Maven Repository</name>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<url>http://repo.veggiecorp.com/artifactory/ext-release-local</url>
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>VeggieCorp</activeProfile>
</activeProfiles>
</settings>
现在,我将再次尝试部署,但不要在 URL 中输入用户名和密码:
$ mvn deploy:deploy-file \
-Durl=http://repo.veggiecorp.com/artifactory/ext-release-local \
-Dfile=crypto.jar \
-DpomFile=pom.xml \
-Did=VeggieCorp
yadda...yadda...yadda
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.751s
[INFO] Finished at: Mon Aug 20 10:17:15 CDT 2012
[INFO] Final Memory: 4M/119M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy- file (default-cli) on project crypto:
Failed to deploy artifacts: Could not transfer artifact
com.veggiecorp:crypto:jar:2.0.0 from/to remote-repository
(http://mvn.veggiecorp.com/artifactory/ext-release-local):
Failed to transfer file:
http://mvn.veggiecorp.com/artifactory/ext-release-local/com/veggiecorp/crypto/2.0.0/crypto-2.0.0.jar.
Return code is: 401, ReasonPhrase:Unauthorized. -> [Help 1]
(我已重新格式化输出以使其更易于查看。我收到 401“未授权”错误)
那么,我做错了什么?为什么我不能使用我的.settings.xml
文件来做我的凭据?代理部分确实有效,因为它可以从主 Maven 存储库下载所需的插件。
【问题讨论】:
嗨,我在应用 release:perform 时也遇到了同样的问题。它显示错误:-无法执行目标 org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy)。你能帮我吗? @JDeveloper 您看到我在下面检查的答案了吗?您很可能传入了错误的参数。如果这不是问题,请创建一个新问题,并输入所有信息(就像我一样)。这就是为什么我的得到了答复。 Stefan Fersti 看到了我的无效参数。 我刚刚在其他频道回答了。 ***.com/questions/37543120/… 【参考方案1】:您需要提供repositoryId=VeggieCorp
(不是id
)属性,以便maven 知道它必须从哪个<server>
配置中读取凭据。
$ mvn deploy:deploy-file \
-Durl=http://repo.veggiecorp.com/artifactory/ext-release-local \
-Dfile=crypto.jar \
-DpomFile=pom.xml \
-DrepositoryId=VeggieCorp
见http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
【讨论】:
谢谢。我已经经历了几个小时。我的另一个愚蠢的疏忽:不是-Did=VeggieCorp
。应该是-
--DrepositoryId=VeggieCorp
。它现在甚至可以在 Jenkins 中使用。下一步:加密密码。
@JDeveloper 您可以使用-Dversion=<my-version>
属性来指定版本号。 Here 您将找到所有可用的属性来将文件部署到您的存储库中。 pom.xml
文件不是必需的,但您至少需要指定 groupId
、artifactId
和 version
。
谢谢@StefanFerstl。我需要动态增加版本号。我正在为这个 deploy:deploy-file 命令使用 jenkins。
@JDeveloper 如果您的项目不是 maven 项目,即没有 pom.xml,这可能会很困难。也许buildnumber-maven-plugin 会以某种方式帮助你。但我强烈建议您将您的项目转换为常规的 maven 项目并执行 releases 以“增加”您的版本号。
是的,伙计,我正在尝试将 pom.xml 与 maven 发布插件一起使用。【参考方案2】:
您还可以在 distributionManagement 中指定您的快照存储库 ID
<distributionManagement>
<repository>
<id>releases</id>
<url>$env.MAVEN_RELEASE_REPOSITORY_URL</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>$env.MAVEN_SNAPSHOT_REPOSITORY_URL</url>
</snapshotRepository>
</distributionManagement>
此处的 id 应与 servers
中的 id 匹配
【讨论】:
以上是关于Maven:尝试使用 settings.xml 文件中的凭据进行部署的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Maven 从 pom.xml 中的 settings.xml 访问元素?