Ссылка на класс из конкретного файла JAR - PullRequest
2 голосов
/ 20 декабря 2011

Я застрял в довольно неловкой ситуации в моей программе. Дело в том, что ... у моего проекта есть некоторый файл A.jar в classpath, который упаковывает много важных служебных классов ... но этот A.jar довольно старый файл, и мы не можем заменить его, так как не уверены, как и насколько это важно держит .... Теперь мне нужен метод request.setCharacterencoding() & response.setCharacterEncoding из ServletResponse I / F, но этот A.jar содержит старую версию ServletResponse и из-за которой я не получаю два вышеуказанных метода. Теперь я ввел новый servlet-api.jar в classpath, но мой проект использует ссылку servletRespons e класса от A.jar, а не от нового servlet-api.jar.

Можете ли вы, ребята, предложить мне способ получить ссылку на новый servletResponse от servlet-api.jar, а не A.jar

(P.s.: Я не могу удалить / изменить A.jar)

Спасибо ...

Ответы [ 6 ]

4 голосов
/ 20 декабря 2011

Когда вы запускаете файл jar, заставьте classpath отражать порядок jar-файлов, которые вы хотите загрузить. Дайте мне знать, если вам нужен точный синтаксис, но в целом, если у вас CLASSPATH = patch16.jar: patch15.jar: patch14.jar: ... и т. Д., Он загрузит первую соответствующую копию класса, начиная с patch16. .jar, затем patch15.jar и т. д.

Подробнее о точном синтаксисе: http://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html

1 голос
/ 20 декабря 2011

На самом деле JVM ищет классы, последовательно пытаясь загрузить их из ресурсов из списка. Если, например, ваш путь к классу выглядит как new.jar;old.jar, и оба jar-файла имеют разные версии одного и того же класса, будет использоваться версия из new.jar.

Обратите внимание, что если вы используете Unix, используйте : вместо ;.

Но позвольте мне выразить сомнение. Что-то звучит неправильно в вашем проекте. Почему у вас есть ServletRequest в вашей пользовательской банке? Я должен использовать стандартный j2ee.jar или что-то в этом роде, чтобы получить этот тип стандартных классов. Насколько я знаю, только один метод был удален из API сервлетов за последние 12 лет: возможность выполнять взаимодействие сервлет-сервлет. И это произошло около 10 лет назад. Так что если вы используете последнюю версию стандартного API сервлета, все, включая старый код, должно работать.

1 голос
/ 20 декабря 2011

Пусть сервлет-апи.jar появится перед А.джаром на вашем пути к классам.

Однако, ваши проблемы не все решены!Что делает что-то в A.jar, если ожидает старую реализацию Servlet API, но новая была загружена?Или что происходит, когда у кого-то еще нет пути к классам в том же порядке?

Возможно, вам лучше разархивировать A.jar и упаковать его как A -ified.jar

0 голосов
/ 20 декабря 2011

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

Однако вы можете написать пользовательский ClassLoader, который может выполнять специальные действия для нужных вам классов, в частности, в этом случае загрузка ServletResponse из servlet-api.jar, в противном случае A.jar в classpath до servlet-api.jar

p.s. Узнайте, кто создал класс с тем же пакетом и именем, что и ServletRequest, и убейте их.

0 голосов
/ 20 декабря 2011

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

0 голосов
/ 20 декабря 2011

Простое решение, если эти два ServletRqquest находятся в разных пакетах, просто не импортируйте устаревший, а получите доступ к нему с полным именем пакета.Или вам нужно написать собственную загрузку класса, чтобы загрузить эту банку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...