情况是我需要将一个可运行的jar,X.jar打包成一个OSGi包。 jar本身无法修改,OSGi是强制性的,因为X.jar将通过需要OSGi包的软件程序进行分发和运行。 X.jar中包含的应用程序是通过网络与另一个应用程序进行通信。
我的计划是用eclipse创建一个OSGi包,然后在其中包含X.jar。但问题是没有检测到X.jar。如果我试图在我的文件系统上访问X.jar的副本,它可以工作。我的捆绑文件结构:
-\MyBundle
-\META-INF
-\MANIFEST.MF
-\src
-\mybundle
-\Activator.class
-\X.jar
激活:
public void start(BundleContext context) {
Thread XThread = new Thread(){
public void run(){
try {
Runtime.getRuntime().exec("java -jar X.jar");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
的Manifest.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Bundle
Bundle-SymbolicName: myBundle
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.ericsson.mas.Activator
Bundle-ClassPath: .,X.jar
Bundle-Vendor: BundleVendor
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: org.osgi.framework;version="1.3.0"
我怀疑我的Bundle-ClassPath存在一些问题,但是当我搜索时它似乎是正确的。非常感谢任何帮助。
注意:我知道这完全违背了OSGi的理念。
答案 0 :(得分:2)
如果要将其作为外部java进程运行,则需要从bundle中提取jar并指向提取的jar。您的bundle data file存储空间是提取数据包的好地方。将jar放在类路径上只有在想要直接在激活器中加载类时才有用。
答案 1 :(得分:0)
您也可以通过直接调用已声明的主类来运行它,而无需提取它并运行另一个Java进程。 因此,请查看X.jars清单,然后将其声明为Main。然后在您的激活器中,只需调用:
the.package.from.x.MainClassX.main(new String[] {});
在线程内。