Классы Java не могут получить ресурсы в файлах JAR, скомпилированных с IKVM - PullRequest
2 голосов
/ 05 октября 2011
Я успешно преобразовал библиотеку Java с помощью ikvmc.Библиотека Java использует некоторые ресурсы внутри собственного файла JAR.Я могу получить доступ ко всем классам этой библиотеки Java, но если я вызываю метод, который вызывает this.getClass (). GetResource (), он не ищет эти ресурсы в сборке или в файле jar в сборке.Но если я помещу эти ресурсы в одну папку со сборкой, он сможет найти ресурсы.Но это не всегда хорошо работает.Например, он не может найти ресурсы, если я ссылался на сборку в проекте веб-сайта (mvc).Я попытался поместить эти ресурсы в папку bin, корневую папку, папку представления и т. Д. (см. Мой комментарий к этому сообщению) Так что мне нужно постоянное решение.Библиотека Java является проектом с открытым исходным кодом.Но я не хочу менять источники.Поскольку для компиляции проекта требуются eclipse, ant, сторонние библиотеки и т. Д. Также в следующем выпуске библиотеки java мне придется изменить код и скомпилировать его. Я видел "ресурсный" параметр ikvmc.Но я не смог найти документацию или пример для этого. Теперь я попытаюсь реализовать класс .net, производный от класса java, который вызывает метод getResource.И тогда я перейду к методу, который вызывает метод getResource.Но это тоже не постоянное решение.

1 Ответ

3 голосов
/ 06 октября 2011

Я нашел решение. На самом деле я нашел, где я сделал не так. Сначала я преобразовал библиотеку Java следующим образом:


    ikvmc first.jar -target:library -out:main.library.dll
    ikvmc second.jar -target:library -out:second.dll -r:main.library.dll
    ikvmc third.jar -target:library -out:third.dll -r:main.library.dll

Тогда я объединил все эти библиотеки с ILMerge. Проблема не в слиянии библиотек. Проблема была в загрузке курортов. Функция загрузчика находится в основной библиотеке. И вторая, и третья библиотеки используют эту функцию загрузчика из основной библиотеки. Таким образом, функция загрузчика ищет только свой файл jar, который является first.jar. он не ищет другие банки, даже если все они находятся в одной объединенной DLL. Поэтому я изменил свой скрипт конвертирования следующим образом:


    ikvmc first.jar -target:library -out:merged.library.dll -sharedclassloader { second.jar } { third.jar }

Итак, все банки объединены с этой единственной командной строкой. Хотя мне больше не нужно использовать ILMerge. Никаких объяснений по поводу «sharedclassloader» на странице справки ikvmc нет. Я нашел это объяснение в этой странице .

...