Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jenkins-使用通配符执行shell命令_Java_Shell_Maven_Jenkins - Fatal编程技术网

Java Jenkins-使用通配符执行shell命令

Java Jenkins-使用通配符执行shell命令,java,shell,maven,jenkins,Java,Shell,Maven,Jenkins,我试图让Jenkins执行shell命令,但仍然允许使用通配符。以下是我试图做的参考: mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=Spigot/Spigot-Server/target/spigot

我试图让Jenkins执行shell命令,但仍然允许使用通配符。以下是我试图做的参考:

mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=Spigot/Spigot-Server/target/spigot-*.jar

我需要能够通过上面的命令部署这个jar,因为该项目的git存储库不是我所有或操作的,所以我需要能够将它直接部署到我自己的Nexus实例。为了确保它支持编译后的jar的所有可能版本,我必须使用通配符。不幸的是,当Jenkins试图执行该命令时,它会按照字面意思使用通配符。我真的不知道如何解决这个问题,如果你能提供帮助,我将不胜感激。谢谢大家!

如果您的意思是希望直接传递
*
,只需使用单引号,以避免shell应用globbing:

mvn deploy:deploy-file [...] '-Dfile=Spigot/Spigot-Server/target/spigot-*.jar'

如果您试图部署多个文件,我认为问题不在于使用Jenkins或bash命令,而在于使用

文件状态

及 如果要部署额外的工件,请使用

因此,如果您通过使用附加的
文件
类型
分类
参数来指定要显式部署的额外文件,则会更好,例如:

... -Dfile=Spigot/Spigot-Server/target/main-spigot.jar \
-Dfiles=$(ls -1d Spigot/Spigot-Server/target/spigot-*.jar | paste -sd ,) -Dtypes=... -Dclassifiers=... 

如果是一个简单的.jar文件,请尝试以下操作:

mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=$(find Spigot/Spigot-Server/target/ -name 'spigot-*.jar')
如果是多个文件,则会有点复杂:

maven deploy file参数文件分类器类型用于在相同的(groupId,artifactId,version)下部署多个工件,例如.jar-sources.jar

即使对于该用例,语法也有点违反直觉-您必须对第一个工件使用file=file1.jar,然后对其余的使用分类器/分类器files=file1 sources.jar,file1 test sources.zip,…(和打包/类型)以相同的方式(位置)指定要上载的每个工件的分类器/类型

如果您的用例是上传不同版本的工件,那么您需要为每个版本执行一个maven部署文件调用

你也可以考虑一些备选方案:

  • (取决于工件数量和新工件出现的频率)手动将这些工件上传到Nexus

  • 让您的Nexus代理另一个为这些工件提供服务的Nexus存储库


  • 事实上,我想要的是相反的。这不是问题所在。@mattrick:啊。这可能是值得澄清的。你可能需要在多个命令中这样做……不确定。@JonSkeet,FWIW,post确实声明“它从字面上理解通配符”:-)有趣的是,如果命令在Jenkins之外的bash中运行,除非遵循您的报价建议,否则shell确实会在执行命令之前尝试glob。不知道为什么詹金斯的外壳不遵循同样的行为。@tony19:我当然被描述搞糊涂了,所以我怀疑其他人也可能是这样。无论如何,当我可以的时候,我会删除我的答案。非常感谢!作为记录,我只尝试部署一个文件。
    ... -Dfile=Spigot/Spigot-Server/target/main-spigot.jar \
    -Dfiles=$(ls -1d Spigot/Spigot-Server/target/spigot-*.jar | paste -sd ,) -Dtypes=... -Dclassifiers=... 
    
    mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=$(find Spigot/Spigot-Server/target/ -name 'spigot-*.jar')