Интеграция Groovy RootLoader с Java 8 SystemClassLoader - PullRequest
0 голосов
/ 04 ноября 2019

Это глубоко внутри библиотеки, которую я использую. В 2015 году это работало с Groovy 2.3 и более ранними версиями 2.4, возможно, с Java 6 или 7! Я хотел обновить до Java 8, прежде чем пытаться изменить для Java9 +.

final class DynamicClassLoader extends ClassLoader {

    final NodeID originatingNode;
    NetChannelOutput requestClassData;
    NetChannelInput classDataResponse = NetChannel.net2one();
    final Hashtable classes = new Hashtable();

    DynamicClassLoader(NodeID originator, NetChannelLocation requestLocation) {
        super(ClassLoader.getSystemClassLoader());
        this.originatingNode = originator;
        this.requestClassData = NetChannel.one2net(requestLocation);
    }
    ...
}

Когда я пытаюсь вызвать код из Groovy, я получаю следующую ошибку: org.codehaus.groovy.tools.RootLoader cannot be cast to jcsp.net2.mobile.DynamicClassLoader

Точка, гдеэто вызывается из приведенного в следующем коде в строке, обозначенной **

    public byte[] filterTX(Object obj)
        throws IOException
    {
        ClassLoader loader = obj.getClass().getClassLoader();
        byte[] bytes = this.internalFilter.filterTX(obj);
        if (loader == ClassLoader.getSystemClassLoader() || loader == null)
        {
            DynamicClassLoaderMessage message = new DynamicClassLoaderMessage(Node.getInstance().getNodeID(),
                    (NetChannelLocation) ClassManager.in.getLocation(), bytes);
            byte[] wrappedData = this.internalFilter.filterTX(message);
            return wrappedData;
        }
        **DynamicClassLoader dcl = (DynamicClassLoader)loader;**
        DynamicClassLoaderMessage message = new DynamicClassLoaderMessage(dcl.originatingNode,
                (NetChannelLocation) ClassManager.in.getLocation(), bytes);
        byte[] wrappedData = this.internalFilter.filterTX(message);
        return wrappedData;
    }

После обсуждения с сообществом Groovy я обнаружил, что проблема заключается в том, как Intellij вызывает скрипты Groovy. Код работает в Eclipse без каких-либо проблем. В Intellij было необходимо создать артефакт jar для каждого из сценариев, которые я хотел запустить параллельно, которые затем можно было запустить из интерфейса командной строки. Я перекодировал приложение в Java 8, и оно работало без проблем. Надеюсь, это поможет.

...