Как переопределить некоторые классы в 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 концепция

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

План Высокого Уровня

  1. ваш агент Java разработан, банку записаны рядом с твоим баром.jar (как агент будет читать bar.банку напрямую)
  2. отредактируйте командную строку запуска JBoss, чтобы включить -javaagent:/path/to/your/agent.jar
  3. теперь во время запуска JBoss ваш агент заменит каждый класс соответствующим, если он присутствует в вашем предоставленном баре.Джар

вещи могут стать немного более сложными в зависимости от вашей версии JBoss и модели развертывания, но есть руководства для популярной установки агентов которую можно легко приспособиться к нашем случае