Определите во время выполнения, какую библиотеку нужно использовать на JBoss - PullRequest
0 голосов
/ 20 августа 2011

есть ли способ решить во время выполнения, какой класс из какого jar (развернутого в jboss) будет использоваться?

Вот пример:

VERSION1.JAR

package com.something;

public class MyObject {

   public void saySomething() {
       System.out.println("Output from version 1");
   }
}

VERSION2.JAR

package com.something;

public class MyObject {

   public void saySomething() {
       System.out.println("Output from version 2");
   }
}

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

package com.main

public class Main{

   public static void main(String[] args) {

        MyObject v1 = new MyObject();
        v1.saySomething();

        MyObject v2 = new MyObject();
        v2.saySomething();

   }
}

Это возможно? Я использую Jboss в качестве сервера приложений, и я делаю это в рамках проекта ejb. Так что этот пример просто чтобы объяснить, что я имею в виду. Я думаю, может быть, с помощью контекста?

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

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

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

0 голосов
/ 22 августа 2011

В Java вы можете динамически загружать классы из файлов JAR, но развертывание означает передачу всех решений вашему серверу приложений. В случае jboss вы можете определить политику, определяющую, какие загрузчики классов будут иметь приоритет.

Если вы пытаетесь внедрить какую-то систему плагинов - не устанавливайте банки. Это не значит, что вы не можете упаковать свои банки в свое приложение. Для WAR просто не помещайте их в / WEB-INF / lib. Вы можете положить их, например, в. / WEB-INF / plugins и использовать что-то вроде этого для загрузки:

ClassLoader parent = Thread.currentThread().getContextClassLoader();
URL url = parent.getResource("/WEB-INF/plugins/plugin-x.jar");
ClassLoader loader = URLClassLoader.newInstance(
    new URL[] { url },
    parent
);
Class<?> clazz = Class.forName("com.something.MyObject", true, loader);
Object myObject = clazz.getConstructor().newInstance();
Method saySomething = class.getMethod("saySomething");
saySomething.invoke(myObject);
...