[英]Maven OSGi project compiles, but won't run
我一直在嘗試將Paul Bakker的 ( @ paul-bakker ) 移植 到OSGi上使JavaFX更好: javafx-osgi-example到使用Apache Felix Maven Bundle插件(BND)的Maven OSGi項目。 到目前為止,它可以編譯,沒有任何錯誤,但是我無法運行它:
Starting OSGi Framework
Found declarative services implementation: file:/C:/Users/Rev/.m2/repository/org/apache/felix/org.apache.felix.scr/1.6.2/org.apache.felix.scr-1.6.2.jar
INFO : org.apache.felix.scr (1): Version = 1.6.2
Bundle: org.apache.felix.framework
Registered service: [org.osgi.service.resolver.Resolver]
Registered service: [org.osgi.service.packageadmin.PackageAdmin]
Registered service: [org.osgi.service.startlevel.StartLevel]
Bundle: org.apache.felix.scr
Registered service: [org.apache.felix.scr.ScrService]
Registered service: [org.osgi.service.cm.ManagedService]
Registered service: [org.apache.felix.scr.impl.ScrGogoCommand]
DEBUG: Starting ComponentActorThread
Bundle: null
Bundle: null
Bundle: null
如您所見,捆綁包永遠不會開始。 沒有引發任何錯誤。 只是根本沒有開始。
為什么不開始捆綁銷售?
項目資源
從終端(Windows),mvn clean install可以完美運行。
更新
我一直試圖從Eclipse運行它,但沒有成功:
運行->運行方式-> Java應用程序
用於Web開發人員的Eclipse Java EE IDE。
版本:Mars.2版本(4.5.2)
Build ID:20160218-0600
更新
我在rev.dist
包中的dist下有一個類App
,它可以啟動。 它會遍歷rev下的所有目錄,並啟動名稱與resources/plugins.txt
下的名稱匹配的所有jar。
APP.java
package rev.dist;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.stream.Collectors;
import org.apache.commons.io.FilenameUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
public class App {
FrameworkFactory frameworkFactory;
private Framework framework;
private List<String> pluginsList = new ArrayList<>();
private int addedPlugins;
public static void main(String[] args) throws BundleException, URISyntaxException {
App app = new App();
app.initialize();
}
private void initialize() throws BundleException, URISyntaxException {
this.plugins();
Map<String, String> map = new HashMap<String, String>();
// make sure the cache is cleaned
map.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
map.put("ds.showtrace", "true");
map.put("ds.showerrors", "true");
frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
framework = frameworkFactory.newFramework(map);
System.out.println("Starting OSGi Framework");
framework.init();
loadScrBundle(framework);
File baseDir = new File("../");
String baseDirPath = baseDir.getAbsolutePath();
File[] files = new File(baseDirPath).listFiles();
this.showFiles(files);
for (Bundle bundle : framework.getBundleContext().getBundles()) {
bundle.start();
System.out.println("Bundle: " + bundle.getSymbolicName());
if (bundle.getRegisteredServices() != null) {
for (ServiceReference<?> serviceReference : bundle.getRegisteredServices())
System.out.println("\tRegistered service: " + serviceReference);
}
}
}
public void showFiles(File[] files) throws BundleException {
if (addedPlugins != pluginsList.size()) {
System.out.println(":: " + pluginsList.size());
addedPlugins--;
}
for (File file : files) {
if (file.isDirectory()) {
// System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
String[] bits = file.getName().split(".");
if (bits.length > 0 && bits[bits.length - 1].equalsIgnoreCase("jar")) {
// framework.getBundleContext().installBundle(file.toURI().toString());
}
// String ext = FilenameUtils.getExtension(file.getAbsolutePath());
String basename = FilenameUtils.getBaseName(file.getName());
if (pluginsList.contains(basename)) {
framework.getBundleContext().installBundle(file.toURI().toString());
System.out.println("File: " + file.getName());
System.out.println("Base >>>>>>>>>>>>> : " + basename);
pluginsList.remove(basename);
}
}
}
}
public void plugins() {
File plugins = new File("src/main/resources/plugins.txt");
String fileName = plugins.getAbsolutePath();
try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))) {
// br returns as stream and convert it into a List
pluginsList = br.lines().collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
pluginsList.forEach(System.out::println);
addedPlugins = pluginsList.size();
}
private void loadScrBundle(Framework framework) throws URISyntaxException, BundleException {
URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class");
if (url == null)
throw new RuntimeException("Could not find the class org.apache.felix.scr.ScrService");
String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", "");
System.out.println("Found declarative services implementation: " + jarPath);
framework.getBundleContext().installBundle(jarPath).start();
}
}
我已經發布了Drombler FX的幾個第一個Early Access版本-JavaFX的模塊化應用程序框架。
它不是基於Paul Bakker的工作,而是基於OSGi和Maven(POM優先)。 也許您覺得它有用。 該應用程序框架是開源的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.