0

几天以来我面临一个问题,我无法得到解决方案。以下是我的应用程序结构:

我在 MyearDeployedOnJboss7.ear 中有 ejbapp.jar 与 equinox-server-side-app.war(使用 warproduct 构建)处于同一级别,我想从 iModernizeWebClient_1.0.0.jar 中的 MyJarToLaoadForEjbapp.jar 加载类,它在插件中equinox-server-side-app.war 文件夹(我想显示应用程序结构的图像,但我无法发送图像,因为论坛规则需要 10 分才能做到这一点)

我的问题是如何允许 ejbapp.jar 从位于 equinox-server-side-app.war 中的 MyWebClient_1.0.0.jar 的插件文件夹中的“MyJarToLaoadForEjbapp.jar”加载类。

我认为使用 servletbridge 类加载器,但不知道如何使用它。

在我的 launch.ini 中,我有:

osgi.*=@null org.osgi.*=@null eclipse.*=@null osgi.parentClassloader=app osgi.contextClassLoaderParent=app
4

1 回答 1

0

我使用 OSGI 规范中的 Servlet HttpServiceTracker 解决了我的问题。怎么做:写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");
}

在方法 start 的插件激活器类中:

@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.");
}

并在 stop 方法中取消注册 servlet:

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

就这样。您的 servlet 可以在 eclipse 包之外访问,您可以在包中调用方法。

于 2013-06-10T14:26:51.167 回答