Встроить Apache felix Ipojo как настольное приложение Java

Как я могу создать приложение IPOJO, такое как приложение Java, которое можно открыть двойным щелчком?

У меня есть код:

//App.java
package app;
import app.testipojo.HelloComponent;
import java.util.HashMap;
import java.util.Map;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.framework.FrameworkFactory;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Validate;
import org.apache.felix.main.AutoProcessor;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.launch.Framework;


@Component
@Instantiate
public class HelloComponentApp {

@Requires
HelloComponent c;
public HelloComponentApp() {
}


    @Validate
    public void start(){
        c.test();
    }

    public static void main(String args[]) throws BundleException, InterruptedException{




    FrameworkFactory ff = new FrameworkFactory ();
    Map<String,Object> config;
        config = new HashMap<>();

         config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,"org.osgi.service.log;version=1.3, org.apache.felix.ipojo.architecture;version=1.11.0, org.apache.felix.ipojo;version=1.11.0,"+
                 "org.osgi.service.cm;version=1.2,"+"app.testipojo;version=1.0.0.SNAPSHOT");

     config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);

    config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");

    Framework fwk = ff.newFramework(config);
    fwk.start();
    BundleContext context = fwk.getBundleContext();


      String home_dir="file:/G:/HOW_TO_PRONOUNCE/install/jar/";
   AutoProcessor.process(config, context);
     Bundle bundle = context.installBundle(home_dir+"testipojo/target/testipojo-1.0-SNAPSHOT.jar");
     bundle.start();

     System.out.println("Started");

        bundle.stop();


        fwk.stop();
        fwk.waitForStop(1000);

        }
}

Пакет IPOJO для запуска

package app.testipojo;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;

@Component
@Instantiate
public class HelloComponent {

public HelloComponent() {

}

    public void test(){
        System.out.println("Hello world!");
    }
}

Он работает без ошибок, но печатает только «запущен». Он не печатает «Hello world». Пожалуйста, помогите мне решить эту проблему.


person vinu k n    schedule 13.12.2013    source источник
comment
Я думаю, что метод start() в вашем приложении не выполняется. Выполняется только основной метод.   -  person Traveling Salesman    schedule 22.01.2014


Ответы (1)


Я считаю, что вам понадобится контекст osgi для запуска приложения. См. https://ilikeorangutans.github.io/2012/10/23/osgi-bootstrapping/ для различных способов начальной загрузки экземпляра felix.

Как только у вас будет запущен экземпляр felix, вы должны установить и запустить пакеты ipojo, и ваш компонент запустится.

Таким образом, при двойном щелчке по ссылке необходимо настроить среду для запуска ipojo (контейнер osgi: felix, equinox и т. д.), а затем установить пакет приложений. Как только это произойдет и все разрешится, контейнер вызовет start для вашего компонента.

И затем после того, как действительно прочитал код :) Взгляните на http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html. Я думаю, вам не хватает чего-то, что поможет в этом процессе.

person Craig    schedule 10.10.2014