2013-05-30 1 views
0

У меня проблемы с несколькими днями, и я не могу получить решение. Ниже представлена ​​моя структура приложения:Как загрузить класс из jar внутри приложения на стороне сервера equinox в jboss 7

У меня есть ejbapp.jar внутри MyearDeployedOnJboss7.ear на том же уровне equinox-server-side-app.war (созданный с использованием warproduct), и я хочу загрузить класс из MyJarToLaoadForEjbapp.jar, который является в iModernizeWebClient_1.0.0.jar, который находится в папке плагинов equinox-server-side-app.war (я хочу показать изображение структуры приложения bu, я не могу отправить изображение, потому что для правил форума требуется 10 баллов, чтобы это сделать)

Мой вопрос заключается в том, как разрешить классы загрузки ejbapp.jar из «MyJarToLaoadForEjbapp.jar» внутри папки плагина MyWebClient_1.0.0.jar, которая находится в equinox-server-side-app.war.

Я думаю, используя загрузчик классов servletbridge, но не знаю, как его использовать.

в моем launch.ini я:

osgi.*[email protected] org.osgi.*[email protected] eclipse.*[email protected] osgi.parentClassloader=app osgi.contextClassLoaderParent=app 

Thnx за помощью

ответ

0

Я решил мой proble с помощью сервлета HttpServiceTracker из OSGI спецификации. как это сделать: написать HttpServiceTracker Liket что:

public class HttpServiceTracker extends ServiceTracker { 

private static final Logger logger = Logger 
     .getLogger(HttpServiceTracker.class.getName()); 


public HttpServiceTracker(BundleContext context) { 
    super(context, HttpService.class.getName(), null); 
} 

public Object addingService(ServiceReference reference) { 
    HttpService httpService = (HttpService) context.getService(reference); 
    logger.info("default context path : " 
      + org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.ID_HTTP_CONTEXT); 
    try { 
     logger.info("will register servlet "); 
     httpService.registerServlet("/programLauncherServlet", 
       new ProgramLauncherServlet(), null, null); 
     logger.info("servlet has been registred with http context "); 
     // httpService.registerResources("/", "/html", null); 
    } catch (Exception e) { 
     //e.printStackTrace(); 
     logger.info("The alias '/programLauncherServlet' is already in use"); 
    } 

    return httpService; 
} 

public void removedService(ServiceReference reference, Object service) { 
    logger.info("will unregister servlet "); 
    HttpService httpService = (HttpService) service; 
    httpService.unregister("/programLauncher"); 
    super.removedService(reference, service); 
    logger.info("servlet has been unregistred"); 
} 

в вашем плагине класса активатора при запуске метода:

@Override 
public void start(BundleContext context) throws Exception { 
    super.start(context); 
    Activator.plugin = this; 

    BundleContext osgiContext = BundleReference.class 
      .cast(AnyClassOfYourProject.class.getClassLoader()).getBundle() 
      .getBundleContext(); 
    serviceTracker = new HttpServiceTracker(osgiContext); 
    serviceTracker.open(); 
    LOGGER.info("servlet published !!"); 
    LOGGER.info("Bundle started."); 
} 

и незарегистрированный сервлета в методе остановки:

public void stop(BundleContext context) throws Exception { 
    Activator.plugin = null; 
    serviceTracker.close(); 
    serviceTracker = null; 
    LOGGER.info("servlet unregistered from context !!"); 
    super.stop(context); 
} 

это все. ваш сервлет доступен вне вашего пакета eclipse, и вы можете вызвать методы внутри пакета.

 Смежные вопросы

  • Нет связанных вопросов^_^