运行包含在OSGi捆绑包中的jar



情况是我需要将一个可运行的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();
            }
        }
      };
 }

清单.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"

我怀疑我的捆绑类路径存在一些问题,但当我四处搜索时,它似乎是正确的。任何帮助将不胜感激。

注意:我知道这完全违背了OSGi的理念。

如果要将其作为外部 Java 进程运行,则需要从捆绑包中提取 jar 并指向提取的 jar。您的捆绑包数据文件存储是提取捆绑包的好地方。仅当您想直接在激活器中加载类时,将 jar 放在类路径上才有帮助。

您也可以通过直接调用声明的主类来运行它,无需提取它并运行另一个 java 进程。所以看看 X.jars 清单,它应该是一个 Main 声明。然后在您的激活器中,只需调用:

the.package.from.x.MainClassX.main(new String[] {});

在你的线程内。

最新更新