2017-01-31 3 views
0

私はgroovyでいくつかのスクリプトを書き始めました。私は基本的にhtmlページを解析し、データで何かを行うこのスクリプトを書いた。IllegalAccessExceptionがStringHashMapにアクセスしようとしました - Groovy

ここでは、HTTPリクエストを実行するためにHTTPBuilderを使用します。私は、要求のこの種を実行しようとするたびに、私はこのエラーを取得する:

Caught: java.lang.IllegalAccessError: tried to access class groovyx.net.http.StringHashMap from class groovyx.net.http.HTTPBuilder 
java.lang.IllegalAccessError: tried to access class groovyx.net.http.StringHashMap from class groovyx.net.http.HTTPBuilder 
    at groovyx.net.http.HTTPBuilder.<init>(HTTPBuilder.java:177) 
    at groovyx.net.http.HTTPBuilder.<init>(HTTPBuilder.java:218) 
    at Main$_main_closure1.doCall(Main.groovy:30) 
    at Main.main(Main.groovy:24) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:143) 

ここではメインクラスのコードです:

// Grap HTTPBuilder component from maven repository 
@Grab(group='org.codehaus.groovy.modules.http-builder', 
     module='http-builder', version='0.5.2') 
// import of HttpBuilder related stuff 
import groovyx.net.http.* 
import parsers.Parser 
import parsers.WuantoParser 
import parsers.Row 

class Main { 

    static mapOfParsers = [:] 
    static void main(args) { 
     List<Row> results = new ArrayList<>() 

     // Initiating the parsers for the ebay-keywords websites 
     println "Initiating Parsers..." 
     initiateParsers() 

     println "Parsing Websites..." 
     mapOfParsers.each { key, parser -> 
      switch (key) { 
       case Constants.Parsers.WUANTO_PARSER: 
        println "Parsing Url: $Constants.Url.WUANTO_ROOT_CAT_URL" 
        println "Retrieving Html Content..." 

        def http = new HTTPBuilder(Constants.Url.WUANTO_ROOT_CAT_URL) 
        def html = http.get([:]) 

        println "Parsing Html Content..." 

        results.addAll(((Parser) parser).parseHtml(html)) 
        break 
      } 
     } 

     results.each { 
      println it 
     } 
    } 

    static void initiateParsers() { 
     mapOfParsers.put(Constants.Parsers.WUANTO_PARSER , new WuantoParser()) 
    } 

    static void writeToFile(List<Row> rows) { 
     File file = "output.txt" 

     rows.each { 
      file.write it.toString() 
     } 
    } 

} 

答えて

0

まあさんがここで見てみましょう。あなたのスニペットでコードを実行しようとしましたが、httpビルダーの依存関係のバージョン0.5.2はかなり古く、groovyスクリプトが指していたリポジトリにはアクセスできませんでした。だから私はもっと新しいバージョンの0.7.1に置き換えました。

また、コード内のhttp.getから返されるhtml変数の値は、実際には解析された形式です。私。それはテキストではなくむしろgroovy NodeChildオブジェクトです。これは、httpビルダーがデフォルトでhtml解析を行い、必要であればプレーンテキストを返すように明示的に指示しなければならないからです(そしてテキストではなくリーダーを返します)。

次いくぶん再構築し、あなたのコードのバージョンを書き換えアイデアを示しています。

// Grap HTTPBuilder component from maven repository 
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.7.1') 

import groovyx.net.http.* 
import groovy.xml.XmlUtil 
import static groovyx.net.http.ContentType.* 

class MyParser { 
    def parseHtml(html) { 
    [html] 
    } 
} 


def mapOfParsers = [:] 
mapOfParsers["WUANTO_PARSER"] = new MyParser() 

result = [] 
mapOfParsers.each { key, parser -> 
    switch (key) { 
     case "WUANTO_PARSER": 
      // just a sample url which returns some html data 
      def url = "https://httpbin.org/links/10/0" 

      def http = new HTTPBuilder(url) 
      def html = http.get([:]) 

      // the object returned from http.get is of type 
      // http://docs.groovy-lang.org/latest/html/api/groovy/util/slurpersupport/NodeChild.html 
      // this is a parsed format which is navigable in groovy 
      println "extracting HEAD.TITLE text: " + html.HEAD.TITLE.text() 

      println "class of returned object ${html.getClass().name}" 
      println "First 100 characters parsed and formatted:\n ${XmlUtil.serialize(html).take(100)}" 

      // forcing the returned type to be plain text 
      def reader = http.get(contentType : TEXT) 

      // what is returned now is a reader, we can get the text in groovy 
      // via reader.text 
      def text = reader.text 
      println "Now we are getting text, 100 first characters plain text:\n ${text.take(100)}" 

      result.addAll parser.parseHtml(text) 
      break 
    } 
} 

result.each { 
    println "result length ${it.length()}" 
} 

ランニングを上記プリント:

extracting HEAD.TITLE text: Links 
class of returned object groovy.util.slurpersupport.NodeChild 
First 100 characters parsed and formatted: 
<?xml version="1.0" encoding="UTF-8"?><HTML> 
    <HEAD> 
    <TITLE>Links</TITLE> 
    </HEAD> 
    <BODY>0 < 
Now we are getting text, 100 first characters plain text: 
<html><head><title>Links</title></head><body>0 <a href='/links/10/1'>1</a> <a href='/links/10/2'>2</ 
result length 313 

(簡潔にするため省略XmlUtil.serializeからの警告のカップルと)。

これは、あなたが取得している例外を取得する理由を説明していませんが、おそらく上記の方法であなたの問題を解決できます。

関連する問題