Как переопределить некоторые классы в jar в WEB-INF/lib с другим jar в JBoss EAP?
если класс для переопределения называется com.example.FooServlet
и этот класс находится внутри jar WEB-INF/lib/foo.jar
, как переопределить его с помощью класса, также называемого com.example.FooServlet
в другой банке, скажи bar.jar
?
или есть ли способ, чтобы убедиться, что в bar.jar
загружается первым?
делая bar.jar
модуль не-go, потому что FooServlet
импортирует тонны классов из многих банок в WEB-INF/lib
.
как я уже говорил выше, я пытался содержать bar.jar
в модуле, но есть класс не найдено или нет ошибки класса def (не могу четко вспомнить) как FooServlet
расширяет / реализует некоторые дополнительные классы / интерфейсы, которые находятся в сторонних банках в WEB-INF/lib.
мне нельзя трогать foo.jar
или любой из банок, которые уже существуют в WEB-INF/lib
.
3 ответов
Вы сказали, что не можете коснуться существующих банок, и Вы, кажется, подразумеваете, что можете добавить банку твою к WEB-INF/lib
.
по данным этой:
- нет указанного порядка приоритета для банок в
WEB-INF/lib/*.jar
.
Поэтому, если вы добавитеbar.jar
там, вы не знаете, будет ли он загружен до или послеfoo.jar
. - спецификация сервлета говорит классы под
WEB-INF/classes
должен быть загружен перед чем-либо подWEB-INF/lib/*.jar
предполагая, что вы можете добавить банку под WEB-INF/lib
, вы должны иметь возможность добавить класс (или несколько) под WEB-INF/classes
, не касаясь в месте.
Итак, если вы хотите классы от bar.jar
для загрузки сначала вы можете распаковать содержимое этой банки под WEB-INF/classes
вместо этого (или только класс, который вы хотите загрузить в приоритет - например WEB-INF/classes/com/example/FooServlet.class
).
посмотрите на модули JBoss и как их обрабатывать через jboss-deployment-structure.xml
дескрипторов развертывания.
Это просто...
для 2 различных файлов войны вы можете иметь 2 различных модуля, имеющих разные com.образец.FooServlet в разных файлах jars каждый.
вам просто нужно взять свой foo.jar и бу.jar-файлы из WAR-файла и добавьте их в соответствующие модули.
ClassLoader для войны выбирает необходимый класс (ы) из модулей, которые вы определяете в jboss-deployment-structure.xml
и никогда не конфликтует с другими версиями.
Рассмотрение Агента Java
предполагая, что у вас есть полный контроль над тем, как запускается JBoss, или, по крайней мере, вы можете изменить настройки запуска JBoss - вещь, которая приходит вам на помощь, - это Java agent.
в двух словах Java agent-это пользовательский "плагин" jar для JVM, и он может перехватывать загрузку каждого и любого класса этой JVM. И-как раз то, что вам нужно - он может выполнять подстановку байтового кода любого перехваченного класса. дальнейшее чтение о Java agent концепция
цель, которую вы пытаетесь достичь, не является совершенно новой и, кажется, она уже решена на некотором уровне. зацените вопрос а также ответ - похоже, что есть почти полное руководство по написанию агента, который заменяет классы на основе предоставленной внешней банки заменами.
План Высокого Уровня
- ваш агент Java разработан, банку записаны рядом с твоим баром.jar (как агент будет читать bar.банку напрямую)
- отредактируйте командную строку запуска JBoss, чтобы включить
-javaagent:/path/to/your/agent.jar
- теперь во время запуска JBoss ваш агент заменит каждый класс соответствующим, если он присутствует в вашем предоставленном баре.Джар
вещи могут стать немного более сложными в зависимости от вашей версии JBoss и модели развертывания, но есть руководства для популярной установки агентов которую можно легко приспособиться к нашем случае