[英]NoClassDefFoundError when running an OSGI bundle as classic jar
[英]Running a jar included in an OSGi bundle
情況是我需要將一個可運行的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的理念。
如果要將其作為外部java進程運行,則需要從bundle中提取jar並指向提取的jar。 捆綁數據文件存儲是提取捆綁包的好地方。 將jar放在類路徑上只有在想要直接在激活器中加載類時才有用。
您也可以通過直接調用聲明的主類來運行它,無需提取它並運行另一個java進程。 所以看看X.jars清單,應該是Main聲明的。 然后在你的激活器中,只需撥打:
the.package.from.x.MainClassX.main(new String[] {});
在你的線程內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.