Встраивать 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!");
}
}
Он работает без каких-либо ошибок, но печатает только "запущен". Это не печатает "Привет мир". Пожалуйста, помогите мне решить эту проблему.
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. Я думаю, что вам не хватает того, что поможет в этом процессе.