Можно ли использовать Gephi, скомпилированный с помощью IKVM, на веб-сайте?

В настоящее время я пытаюсь загрузить и использовать Gephi Toolkit из .Net 4. Сайт С#.

У меня есть версия jar-файла инструментария, скомпилированная для виртуальной машины IKVM, которая работает, как и ожидалось, из приложения командной строки, используя следующий код:

var controller = (ProjectController)Lookup.getDefault().lookup(typeof(ProjectController));
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();

Три экземпляра правильно создаются в форме, аналогичной org.gephi.project.impl.ProjectControllerImpl@8ddb93.

Однако, если я запускаю точно такой же код с точно такими же операторами использования и ссылками, самая первая строка, загружающая экземпляр ProjectController, возвращает значение null.

Я пробовал пару решений

Во-первых, я попытался игнорировать вызов Lookup.getDefault().lookup(type), вместо этого пытаясь создать свои собственные экземпляры:

var controller = new ProjectControllerImpl();
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();

Это терпит неудачу в строке controller.newProject();, я думаю, потому что внутри (с использованием рефлектора) тот же самый Lookup.getDefault().lookup(type) используется в конструкторе, возвращает null и затем выдает исключение.

Во-вторых, отсюда: Поиск в Jython (и Gephi) Я попытался установить %CLASSPATH% к расположению файлов JAR и DLL инструментария.

Есть ли причина, по которой Lookup.getDefault().lookup(type) не будет работать в веб-среде? Я не разработчик Java, поэтому я немного не в курсе Java-стороны этого.

Я бы подумал, что можно создать все экземпляры самостоятельно, но не смог найти способ сделать это.

Я также не могу найти способ понять, почему загрузка ProjectController вернула значение null. Никаких исключений не выдается, и, если я не очень тупой, похоже, нет способа увидеть результат попытки загрузки.

Обновить – Ответ

Основываясь на ответе Jeroen Frijters, я решил проблему следующим образом:

public class Global : System.Web.HttpApplication
{
    public Global()
    {
        var assembly = Assembly.LoadFrom(Path.Combine(root, "gephi-toolkit.dll"));
        var acl = new AssemblyClassLoader(assembly);
        java.lang.Thread.currentThread().setContextClassLoader(new MySystemClassLoader(acl));
    }
}

internal class MySystemClassLoader : ClassLoader
{
    public MySystemClassLoader(ClassLoader parent)
        : base(new AppDomainAssemblyClassLoader(typeof(MySystemClassLoader).Assembly))
    { }
}

Код ikvm.runtime.Startup.addBootClassPathAssemby() у меня не работал, но по предоставленной ссылке я смог найти решение, которое работает во всех случаях.


person Ed Broome    schedule 21.11.2012    source источник


Ответы (1)


Это проблема с загрузчиком классов Java. В приложении командной строки ваш основной исполняемый файл функционирует как загрузчик системного класса и знает, как загружать зависимости сборки, но в веб-процессе нет основного исполняемого файла, поэтому загрузчик системного класса не знает, как загрузить что-либо полезное.

Одним из решений является вызов ikvm.runtime.Startup.addBootClassPathAssemby() для добавления соответствующих сборок в загрузчик классов загрузки.

Дополнительные сведения о проблемах загрузки классов IKVM см. на странице http://sourceforge.net/apps/mediawiki/ikvm/index.php?title=ClassLoader

person Jeroen Frijters    schedule 22.11.2012