Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с ClassLoader / 13 сообщений из 13, страница 1 из 1
05.03.2012, 14:29:32
    #37691596
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Привет всем.

Есть проблема при загрузки класса. Я написал свой ClassLoader загрузки из каталога сервера. Для работы с базой использую hibernate, класс загружается все хорошо, но при вызове выдает ошибку что не находит класс org.hibernate.Session, храниться в jar архиве, но ведь все jar архивы при компиляции записываются в classpath? Или я путаю? Подскажите что можно сделать.
...
Рейтинг: 0 / 0
05.03.2012, 14:38:56
    #37691620
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
meqonно ведь все jar архивы при компиляции записываются в classpath?
Абсолютное непонимание концепции classpath. Ничего при компиляции туда не записывается. Это собирательное выражение для списка всех путей для поиска классов.
Переменная окружения CLASSPATH почти нигде не искпользуется
classpath используется либо как параметр запуска java.exe
либо как Class-Path: в META-INF/manifest.mf
...
Рейтинг: 0 / 0
05.03.2012, 14:48:52
    #37691646
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Теперь понят. Но как тогда при загрузить кода использующего стороннюю библиотеку, код которой в jar архиве? Можно ли при загрузки моего класса задать мой загрузчик?
...
Рейтинг: 0 / 0
05.03.2012, 14:49:24
    #37691647
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
загрузить код*
...
Рейтинг: 0 / 0
05.03.2012, 15:01:57
    #37691679
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
meqonТеперь понят. Но как тогда при загрузить кода использующего стороннюю библиотеку, код которой в jar архиве? Можно ли при загрузки моего класса задать мой загрузчик?
Можно. А если вы ещё по-русски объясните чего хотите добиться, то можно обсудить и о то как это сделать.
...
Рейтинг: 0 / 0
05.03.2012, 17:16:45
    #37691958
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Как тогда загрузить код использующий стороннии библиотеки(например hibernate), если использую свой загрузчик то он не находи класс org.hibernate.Session. Как в этом случае быть?
...
Рейтинг: 0 / 0
05.03.2012, 17:18:55
    #37691967
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
meqonКак тогда загрузить код использующий стороннии библиотеки(например hibernate), если использую свой загрузчик то он не находи класс org.hibernate.Session. Как в этом случае быть?
a) Указать родительский загрузчик, который знает о либах.
б) В своём загрузчике организовать поиск и по библиотекам тоже.
...
Рейтинг: 0 / 0
05.03.2012, 21:18:09
    #37692380
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Спасибо
...
Рейтинг: 0 / 0
06.03.2012, 07:34:21
    #37692743
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Blazkowicza) Указать родительский загрузчик, который знает о либах.
б) В своём загрузчике организовать поиск и по библиотекам тоже.

Если существует загрузчик, который знает о либах, то надо использовать его в качестве родительского. Иначе классы с одним и и тем же именем, тот же org.hibernate.Session, загруженные разными загрузчиками, будут разными и несовместимыми. В результате будут рантайм ошибки когда в переменную типа Session не удасться присвоить значение типа Session.
...
Рейтинг: 0 / 0
07.03.2012, 17:50:56
    #37695691
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Пошел по методы а) но теперь при вызове метода выдаеться исключение nosuchmethoderror. В чем может быть проблема?
...
Рейтинг: 0 / 0
07.03.2012, 17:55:03
    #37695698
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
meqonПошел по методы а) но теперь при вызове метода выдаеться исключение nosuchmethoderror. В чем может быть проблема?
Разные версии библиотек. Полный текст со стектрейсом покажите.
...
Рейтинг: 0 / 0
09.03.2012, 22:38:27
    #37697425
meqon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
Вообщем, использую tomcat пишу web сервис. Как уже писал пошел по пути а). Библиотека hibernate лежит в WEB-INF/lib. Написал загрузчик.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
public class ServerClassLoader extends ClassLoader {
	private String path;
	private HashMap<String, Class<?>> cache = new HashMap<String, Class<?>>();
	
	public ServerClassLoader(String path, ClassLoader parent) {		
		super(parent);
		this.path = path;
	}
	
	@Override
	public Class<?> loadClass(String name) {
		File f = new File(path + name.replace('.', '/') + ".class");
		try {
			if (f.exists() == false)		
				return super.findSystemClass(name);
			
			if (cache.get(name) != null) 
				return cache.get(name);
			
			FileInputStream is = new FileInputStream(f);			
			
			byte[] data = new byte[(int)f.length()];			
			
			if (is.read(data, 0, (int)f.length()) < 0) {
				throw new IOException("");
			}
			
			Class<?> cls = defineClass(name, data, 0, (int)f.length()); 
			
			cache.put(name, cls);
			
			return cls;
		}
		catch(FileNotFoundException e) {
			return null;
		}
		catch(ClassNotFoundException e) {
			return null;
		}
		catch(IOException e) {
			return null;
		}
	}


Вызываю так: ServerClassLoader cl = new ServerClassLoader(<путь где лежат файлы>, ClassLoader.getSystemClassLoader());

При загрузке org/hibernate/Session:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
java.lang.NoClassDefFoundError: org/hibernate/Session
	java.lang.Class.getDeclaredMethods0(Native Method)
	java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
	java.lang.Class.getDeclaredMethod(Class.java:1952)
	service.Engine.invoke(Engine.java:105)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:601)
	com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
	com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ObjectOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:258)
	com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
	com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
	com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
	com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
	com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
	com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
	com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
	com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
	com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
	com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
	com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
	com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
	com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
...
Рейтинг: 0 / 0
11.03.2012, 17:59:12
    #37699213
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с ClassLoader
meqonВообщем, использую tomcat пишу web сервис. Как уже писал пошел по пути а). Библиотека hibernate лежит в WEB-INF/lib. Написал загрузчик.Можно узнать, зачем, если для (отдельных) class-ов есть предопределённое место?
Это если вам так неймётся, что вы распаковали jar.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с ClassLoader / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]