Groovy упаковано в банку, не работающую с использованием maven. Вызвано: java .lang.AbstractMethodError - PullRequest
1 голос
/ 09 марта 2020

Итак, у меня есть коллекция groovy пакетов, и я успешно упаковал их в файл jar с помощью пакета mvn.

Я успешно добавил этот файл jar в другой проект, который прекрасно компилируется, но при попытке чтобы на самом деле использовать jar, я получаю следующую ошибку:

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.AbstractMethodError: pefservices.restapi.Request.getProperty(Ljava/lang/String;)Ljava/lang/Object;
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.restapi.Request.ViewPoint(Request.groovy:185)
at pefservices.restapi.Request.ViewPoint(Request.groovy)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.restapi.Client.profile(Client.groovy:59)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.restapi.Client.getName(Client.groovy:20)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.viewpoint.Client.<init>(Client.groovy:30)
at pefservices.viewpoint.Client.<init>(Client.groovy)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.viewpoint.User.<init>(User.groovy:35)
at pefservices.viewpoint.User.<init>(User.groovy)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.setup.Session.enableFramework(Session.groovy:188)
at pefservices.setup.Session.enableFramework(Session.groovy)
at pefservices.setup.Session$enableFramework.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
at main.App.main(App.groovy:15)
Caused by: java.lang.AbstractMethodError: 
pefservices.restapi.Request.getProperty(Ljava/lang/String;)Ljava/lang/Object;
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:190)
at groovy.lang.Closure.getPropertyTryThese(Closure.java:313)
at groovy.lang.Closure.getPropertyOwnerFirst(Closure.java:307)
at groovy.lang.Closure.getProperty(Closure.java:296)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
at pefservices.restapi.Request$_ViewPoint_closure1.doCall(Request.groovy:182)
at pefservices.restapi.Request$_ViewPoint_closure1.doCall(Request.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at groovy.lang.Closure.call(Closure.java:405)
at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:50)
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:122)
at com.sun.proxy.$Proxy7.get(Unknown Source)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

Ниже приведен класс, в котором он терпит неудачу, кажется, что это происходит всякий раз, когда он пытается получить доступ к свойству класса (я пытался удалить эти строки из этого специфицировал c класс, и он работал просто отлично, но затем потерпел неудачу на другом классе, где он получает другое свойство)

import java.nio.CharBuffer
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

import groovy.json.JsonOutput
import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request as Req
import okhttp3.RequestBody
import okhttp3.Response
import okhttp3.OkHttpClient.Builder as ClientBuilder
import okhttp3.Request.Builder
import okio.Buffer
import pefservices.restapi.User as UserAPI
import pefservices.setup.*

public class Request {

Map <String, String> cache = new HashMap <String, String>()
Map <String, CompletableFuture <?>> inProcess = new HashMap <String, CompletableFuture <?>>()

//includes Authorization

public def ViewPoint(String url, String RequestMethod, def requestBody='', Map headers=[:], boolean asAdmin=true, def asUser=null) {

    if(!url.startsWith("http://"))
    {

        url='http://'+url
    }
    String toBeCached = url+RequestMethod+requestBody+headers+Values+asAdmin+asUser


    waitForRequestifExists(toBeCached)

    if(!cache.containsKey(toBeCached))
    {
        def inputLine
        inProcess.put(toBeCached, new CompletableFuture().supplyAsync(
                {
                    OkHttpClient client = new ClientBuilder().connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS).build();



                    println "restAPI [$RequestMethod] URL: "+url

                    Builder builder =new Builder().url(url)

//                  headers+=["Accept-Encoding" :"gzip, deflate"]
                    headers+=["Accept"          :"application/json, text/plain, */*"]
                    headers+=["Accept-Language" :"en-US,en;q=0.5"]
                    headers+=["Expires"         :"-1"]
                    headers+=["Connection"      :"keep-alive"]

                    if(requestBody instanceof File)
                    {
                        String boundary = "-------------" + System.currentTimeMillis();
                        headers+=['Content-Type':'multipart/form-data; boundary='+boundary]



                    }

                    if(!headers.containsKey("Content-Type"))
                    {
                        headers+=["Content-Type"    :"application/json; charset=UTF-8; odata.metadata=minimal"]
                    }

                    if (!url.contains("api/open") && url.contains(Session.url))
                    {
                        if (asAdmin==true)
                        {
                            headers+=["Authorization"   :Session.tokens['adminToken']];
                        }
                        else if(asUser!=null)
                        {
                            UserAPI userAPI = new UserAPI();
                            headers+=["Authorization"   :userAPI.loginPost(asUser).Token]
                        }
                        else{
                            headers+=["Authorization"   :Session.tokens['userToken']];
                        }
                    }

                    for(entry in headers) {
                        builder.addHeader(entry.key, entry.value)

                    }



                    if (!(requestBody instanceof String) && headers['Content-Type'].toString().contains("json"))
                    {

                        requestBody = JsonOutput.toJson(requestBody)

                    }


                    if (RequestMethod != 'GET')
                    {

                        try{
                            println "Json body:->"+ JsonOutput.prettyPrint(requestBody)
                        }
                        catch (Throwable ex)
                        {
                            println "body:"+ requestBody
                        }
                        if(requestBody instanceof File)
                        {
                            RequestBody body = RequestBody.create(MediaType.parse(headers['Content-Type']), requestBody)
                            RequestBody formBody = new MultipartBody.Builder()
                                    .setType(MultipartBody.FORM)
                                    .addFormDataPart("file", requestBody.getName(), body)
                                    .build()

                            builder.method(RequestMethod, formBody)

                        }
                        else{

                            RequestBody body = RequestBody.create(MediaType.parse(headers['Content-Type']), requestBody)
                            builder.method(RequestMethod, body)
                        }
                    }
                    Req request = builder.build()

                    Response response = client.newCall(request).execute()

                    int responseCode = response.code()
                    String responseTitle = response.message()

                    if(response.header("Content-Disposition")?.contains('attachment'))
                    {
                        String header =response.header("Content-Disposition")
                        String fileExtension = header.substring(header.lastIndexOf('.'))
                        println "Content-Disposition: attachment  - File Extension ->$fileExtension"

                        File file = new File(".\\TestFiles\\temp$fileExtension")
                        InputStream IS= response.body().byteStream()

                        BufferedInputStream input = new BufferedInputStream(IS);
                        OutputStream output = new FileOutputStream(file);

                        byte[] data = new byte[1024];
                        long total = 0

                        int count
                        while ((count =input.read(data)) != -1) {

                            total += count;
                            output.write(data, 0, count);
                        }
                        output.flush();
                        output.close();
                        input.close();
                        inputLine = file
                    }
                    else
                    {


                        inputLine = response.body().string()
                    }

                    println "RESTAPI Response Code: -> "+ responseCode 
                    if (responseCode >= 400)
                    {
                        println "Message: -> " + responseTitle
                        println "Error Resposne body:  -> "+inputLine
                        throw new Exception("Error Code =$responseCode   URL:  $url")
                    }

Сбой, в частности, в строке ниже

                    cache[toBeCached] = inputLine
                }, new Executors().newSingleThreadExecutor()))

        inProcess[toBeCached].get(120, TimeUnit.SECONDS)
        inProcess.remove(toBeCached)

        if(RequestMethod == "POST")
            {println "restapi.Request() ->"+inputLine

            }
        return inputLine
    }
    else
    {
        return cache.get(toBeCached)
    }


}
public void waitForRequestifExists(String key)
{
    if(inProcess.containsKey(key))
    {
        this.inProcess[key].get(120, TimeUnit.SECONDS)
    }
}
public void clearCache()
{
    this.cache = new HashMap <String, String>()
    this.inProcess = new HashMap <String, CompletableFuture <?>>()
}
}

1 Ответ

0 голосов
/ 03 апреля 2020

У меня была похожая проблема, оказалось, что у плагинов maven, используемых для компиляции groovy кода, были некоторые проблемы. Я решил это, используя этот ответ .

В основном вам нужно явно указать версии groovy-eclipse-compiler и groovy-eclipse-batch. В моем POM значение metaversion было установлено на LATEST. Вместо этого попробуйте использовать конкретные значения, такие как <version>3.6.0-03</version>. (Попробуйте очистить ваш кэш .m2 хранилища после этого.)

Это применимо, если вы используете эти плагины в процессе сборки.

...