簡體   English   中英

運行OSGi包中包含的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM