Как проверить, что .jar или класс уже загружен ClassLoader в Java - PullRequest
4 голосов
/ 15 ноября 2011

.. У меня есть приложение (.war), в котором есть система плагинов, в которой каждый подключаемый модуль представляет собой .jar со своими зависимостями .jar. А в веб-приложении через веб-интерфейс администратора плагины загружаются с помощью ClassLoader, который «загружает» .jar и его зависимости. Но проблема в том, что, например, 2 плагина A и B могут иметь одну или несколько общих зависимостей (commons-io.jar, commons-collection.jar, ...) ... поэтому обычно я не должен загружать больше одного раза .jar, который уже загружен другим плагином или уже присутствовал в самом веб-приложении -> WEB-INF / lib / Итак, я хотел бы знать, есть ли способ не загружать в другой раз .jar, который уже был загружен через веб-приложение или другой плагин Если возможно, как я должен это сделать!

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

ПРИМЕЧАНИЕ: каждый плагин представляет собой файл .zip со следующей архитектурой

плагин имя /

       - code/

             - A.class

             - B.class

             - ...

       - lib/

            - commons-io.jar

            - log4j.jar

            - ....

       - description.xml

       - version.txt

каждый файл .class в коде каталога / загружается загрузчиком классов, также загружается каждый .jar в каталоге lib / плагина.

Но обычно я не должен перезагружать классы, присутствующие в .jar "commons-io.jar", если когда-либо он уже присутствовал ...

Надеюсь, я был достаточно ясен, заранее спасибо за внимание и помощь.

Ответы [ 3 ]

6 голосов
/ 15 ноября 2011

Чтобы отследить, какие классы загружены JVM, вы можете добавить

-verbose:class 
Display information about each class loaded.

На ваш выбор перед запуском JVM.

Будет создан вывод типа

[Opened C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar]
1 голос
/ 15 ноября 2011

JVM, совместимая с Sun Microsystems, также отображает классы при загрузке, если вы используете опцию -verbose:class JVM.Однако вы не можете получить доступ к этой информации программно.

0 голосов
/ 15 ноября 2011

Если я правильно понял, вы хотите знать, был ли загружен файл Java или jar или нет, если не загружен только тогда, вы хотите загрузить его? Одно из решений, которое я получаю, состоит в том, что вы можете проверить, есть ли на пути к классу баночка или нет.

...