2016-04-08 81 views
0

我不熟悉Groovy腳本。我正在遠程盒子上運行腳本。像往常一樣使用jfrog刪除構件腳本(https://www.jfrog.com/blog/advanced-cleanup-using-artifactory-query-language-aql/)。根據我的要求更新了主機。但是,當運行命令時,我正在丟失方法異常。Groovy腳本中的MissingMethodException

Artifactory的修訂版4.1.3 40020 PRO

@Grab(group = 'org.codehaus.groovy.modules.http-builder', module = 'http-builder', version = '0.6') 
import groovyx.net.http.RESTClient 
import groovyx.net.http.HttpResponseException 
import org.apache.http.conn.HttpHostConnectException 
    /** 
    * Created by shaybagants on 4/30/15. 
    */ 

def query = 'items.find({"type" : "file","name":{"$eq":"webapp-194-20140604002145-7c157a8afcd3e8fc6a9ecbbf0ec45153991ef23d.war"}})' // replace this with your AQL query 
def artifactoryURL = 'http://localhost:8081/artifactory/' // replace this with your Artifactory server 
def restClient = new RESTClient(artifactoryURL) 
restClient.setHeaders(['Authorization': 'Basic ' + "admin:password".getBytes('iso-8859-1').encodeBase64()]) //replace the 'admin:password' with your own credentials 
def dryRun = true //set the value to false if you want the script to actually delete the artifacts 

def itemsToDelete = getAqlQueryResult(restClient, query) 
if (itemsToDelete != null && itemsToDelete.size() > 0) { 
    delete(restClient, itemsToDelete, dryRun) 
} else { 
    println('Nothing to delete') 
} 

/** 
* Send the AQL to Artifactory and collect the response. 
*/ 
public List getAqlQueryResult(RESTClient restClient, String query) { 
    def response 
    try { 
     response = restClient.post(path: 'api/search/aql', 
      body: query, 
      requestContentType: 'text/plain' 
     ) 
    } catch (Exception e) { 
     println(e.message) 
    } 
    if (response != null && response.getData()) { 
     def results = []; 
     response.getData().results.each { 
      results.add(constructPath(it)) 
     } 
     return results; 
    } else return null 
} 

/** 
* Construct the full path form the returned items. 
* If the path is '.' (file is on the root) we ignores it and construct the full path from the repo and the file name only 
*/ 
public constructPath(HashMap item) { 
    if (item.path.toString().equals(".")) { 
     return item.repo + "/" + item.name 
    } 
    return item.repo + "/" + item.path + "/" + item.name 
} 

/** 
* Send DELETE request to Artifactory for each one of the returned items 
*/ 
public delete(RESTClient restClient, List itemsToDelete, def dryRun) { 
    dryMessage = (dryRun) ? "*** This is a dry run ***" : ""; 
    itemsToDelete.each { 
     println("Trying to delete artifact: '$it'. $dryMessage") 
     try { 
      if (!dryRun) { 
       restClient.delete(path: it) 
      } 
      println("Artifact '$it' has been successfully deleted. $dryMessage") 
     } catch (HttpResponseException e) { 
      println("Cannot delete artifact '$it': $e.message" + 
       ", $e.statusCode") 
     } catch (HttpHostConnectException e) { 
      println("Cannot delete artifact '$it': $e.message") 
     } 
    } 
} 

異常

Caught: groovy.lang.MissingMethodException: No signature of method: test.constructPath() is applicable for argument types: (groovy.json.internal.LazyMap) values: [[created:2014-06-04T00:21:55.149Z, created_by:jenkins, modified:2014-06-04T00:21:55.146Z, ...]] 
Possible solutions: constructPath(java.util.HashMap) 
groovy.lang.MissingMethodException: No signature of method: test.constructPath() is applicable for argument types: (groovy.json.internal.LazyMap) values: [[created:2014-06-04T00:21:55.149Z, created_by:jenkins, modified:2014-06-04T00:21:55.146Z, ...]] 
Possible solutions: constructPath(java.util.HashMap) 
     at test$_getAqlQueryResult_closure1.doCall(test.groovy:41) 
     at test.getAqlQueryResult(test.groovy:40) 
     at test$getAqlQueryResult.callCurrent(Unknown Source) 
     at test.run(test.groovy:16) 

AQL查詢結果。

{ 
"results" : [ { 
    "repo" : "war-release", 
    "path" : "webapp", 
    "name" : "webapp-194-20140604002145-7c157a8afcd3e8fc6a9ecbbf0ec45153991ef23d.war", 
    "type" : "file", 
    "size" : 87411497, 
    "created" : "2014-06-04T00:21:55.149Z", 
    "created_by" : "jenkins", 
    "modified" : "2014-06-04T00:21:55.146Z", 
    "modified_by" : "jenkins", 
    "updated" : "2014-06-04T00:21:55.146Z" 
} ], 
"range" : { 
    "start_pos" : 0, 
    "end_pos" : 1, 
    "total" : 1 
} 
} 

回答

2

那麼,錯誤信息是比較清楚的。 您調用方法constructPath(),該方法預計HashMap作爲參數,但給它一個LazyMap這是不同的。 使您的方法constructPath()預計Map,它會工作,如果LazyMap implements Map