我有一些jar文件(自定义),我需要从Groovy脚本发布到Sonatype Nexus存储库。
我的jar位于Groovy脚本工作的机器上的某个路径中(例如:c:\ temp \ module.jar)。
我的Nexus repo网址是http://:/ nexus / content / repositories /
在这个回购中我有文件夹结构,如:folder1-> folder2-> folder3
在发布我的jar时,我需要在folder3中创建:
经过几天的调查后,我仍然不知道如何创建这样的脚本,但这种方式看起来非常清晰,而不是直接上传。
我找到了http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder和其他一些东西(stackoverflow non script solution)。
我知道如何在我的Groovy脚本中创建ivy.xml,但我不明白如何动态创建build.xml和ivysetting.xml并设置整个系统。
你能帮助理解Groovy的方式吗?
更新 我发现以下命令对我来说很好:
curl -v -F r=thirdparty -F hasPom=false -F e=jar -F g=<my_groupId> -F a=<my_artifactId> -F v=<my_artifactVersion> -F p=jar -F file=@module.jar -u admin:admin123 http://<my_nexusServer>:8081/nexus/service/local/repositories
据我所知,curl对Nexus服务执行POST请求。我是对的吗?
现在我正在尝试使用Groovy HTTPBuilder构建HTTP POST请求。
我应该如何将curl命令参数转换为Groovy的HTTPBuilder请求?
答案 0 :(得分:3)
找到了一种使用常规HttpBuilder执行此操作的方法。
基于来自sonatype的信息以及其他一些来源。
这适用于http-builder版本0.7.2(不适用于早期版本) 并且还需要一个额外的依赖:&#39; org.apache.httpcomponents:httpmime:4.2.1&#39;
该示例还使用针对nexus的基本身份验证。
import groovyx.net.http.Method
import groovyx.net.http.ContentType;
import org.apache.http.HttpRequest
import org.apache.http.HttpRequestInterceptor
import org.apache.http.entity.mime.MultipartEntity
import org.apache.http.entity.mime.content.FileBody
import org.apache.http.entity.mime.content.StringBody
import org.apache.http.protocol.HttpContext
import groovyx.net.http.HttpResponseException;
class NexusUpload {
def uploadArtifact(Map artifact, File fileToUpload, String user, String password) {
def path = "/service/local/artifact/maven/content"
HTTPBuilder http = new HTTPBuilder("http://my-nexus.org/")
String basicAuthString = "Basic " + "$user:$password".bytes.encodeBase64().toString()
http.client.addRequestInterceptor(new HttpRequestInterceptor() {
void process(HttpRequest httpRequest, HttpContext httpContext) {
httpRequest.addHeader('Authorization', basicAuthString)
}
})
try {
http.request(Method.POST, ContentType.ANY) { req ->
uri.path = path
MultipartEntity entity = new MultipartEntity()
entity.addPart("hasPom", new StringBody("false"))
entity.addPart("file", new FileBody(fileToUpload))
entity.addPart("a", new StringBody("my-artifact-id"))
entity.addPart("g", new StringBody("my-group-id"))
entity.addPart("r", new StringBody("my-repository"))
entity.addPart("v", new StringBody("my-version"))
req.entity = entity
response.success = { resp, reader ->
if(resp.status == 201) {
println "success!"
}
}
}
} catch (HttpResponseException e) {
e.printStackTrace()
}
}
}
`
答案 1 :(得分:1)
Ivy是一个开源库,因此,一种方法是直接调用这些类。这种方法的问题在于如何invoke ivy programmatically的例子很少。
由于groovy对生成XML有很好的支持,我赞成稍微笨拙的方法来创建我理解为常春藤用户的文件。
以下示例旨在将文件发布到Nexus,同时生成常春藤和ivysettings文件:
import groovy.xml.NamespaceBuilder
import groovy.xml.MarkupBuilder
// Methods
// =======
def generateIvyFile(String fileName) {
def file = new File(fileName)
file.withWriter { writer ->
xml = new MarkupBuilder(writer)
xml."ivy-module"(version:"2.0") {
info(organisation:"org.dummy", module:"dummy")
publications() {
artifact(name:"dummy", type:"pom")
artifact(name:"dummy", type:"jar")
}
}
}
return file
}
def generateSettingsFile(String fileName) {
def file = new File(fileName)
file.withWriter { writer ->
xml = new MarkupBuilder(writer)
xml.ivysettings() {
settings(defaultResolver:"central")
credentials(host:"myrepo.com" ,realm:"Sonatype Nexus Repository Manager", username:"deployment", passwd:"deployment123")
resolvers() {
ibiblio(name:"central", m2compatible:true)
ibiblio(name:"myrepo", root:"http://myrepo.com/nexus", m2compatible:true)
}
}
}
return file
}
// Main program
// ============
def ant = new AntBuilder()
def ivy = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant')
generateSettingsFile("ivysettings.xml").deleteOnExit()
generateIvyFile("ivy.xml").deleteOnExit()
ivy.resolve()
ivy.publish(resolver:"myrepo", pubrevision:"1.0", publishivy:false) {
artifacts(pattern:"build/poms/[artifact].[ext]")
artifacts(pattern:"build/jars/[artifact].[ext]")
}
注意: