2009-01-12 65 views
7

我有一個作爲OSGi包集合運行的應用程序。我使用嵌入Felix框架的非常小的包裝器啓動它。這個包裝器的必要性讓我感到有些不舒服,因爲它依賴於Felix(而應用程序本身也可以在Equinox中運行),所以我想擺脫它,並使用默認的Felix發射器。訪問來自OSGi包的命令行參數

包裝器確實做的唯一事情就是將命令行參數傳遞到已啓動的OSGi框架中,以便可以對它們做出反應。請注意,它實際上並不解析參數,只是將String []推入我的應用程序中。

是否有一個標準的方式(或至少一個費利克斯標準的方式)從一個包中訪問命令行參數,以便我可以取消自定義啓動器?

+0

public class Application implements IApplication { @Override public Object start(IApplicationContext context) throws Exception { String[] args = (String[])context.getArguments().get("application.args"); // args.length == 0 if no arguments have been passed } } 

參考這是怎麼轉出?您是否最終使用了框架啓動選項而不是-D JVM參數?如果是這樣,willir可以發佈一些關於你的解決方案的信息?謝謝。 – Chris 2010-04-22 19:35:15

回答

1

可能不是。我認爲標準的Felix啓動器會執行一些命令行驗證,並且只接受bundle cache dir作爲參數。不止一個參數和發射器退出。

您可以使用系統屬性在命令行中傳遞信息,我認爲它不僅在felix中也在其他osgi容器中工作,但它可能使您的應用程序不太友好。

+0

是的。 「-Disis -DandThat」似乎工作,但它確實很難看...... – Thilo 2009-01-21 08:46:04

2

遲到的答案,但也許有人認爲它有用。

我有一個很相同的問題。我的應用程序在OSGi中運行,但我有外部接口,我需要遵守這意味着閱讀命令行參數。

這個關鍵是在新的OSGi規範4.2中定義的,即Framework Launching。您可以在生命週期層部分的草稿規範中找到它(在www.osgi.org上的草案下找到)。

這是從獨立的Java應用程序啓動OSGi框架(任何支持OSGi 4.2的實現)的標準方式。巧妙的是,只要在CLASSPATH中找到它,您就不需要知道啓動了哪個實現(Felix,Equinox,...)。

這樣,你的啓動程序讀取命令行參數,實例化並啓動一個OSGi框架並將參數傳遞給你的包(任何你想要的)。你在啓動器應用程序中獲得的是一個框架的上下文,您可以從中與您的軟件包進行通信。

截至Equinox 3.5M6(我認爲,以及至少M6)這是支持。 Apache Felix的最新版本也支持這一點。

+2

我會給一些百萬美元的鏈接灑在這個答案中 – drozzy 2011-02-19 18:03:22

7

如果你使用bnd(工具),你可以使用它的啓動器。它將命令行參數註冊爲服務屬性「launcher.arguments」。

當您將它與bnd軟件包命令結合使用時,它的工作效果非常好。該命令需要一個bnd項目或一個描述運行環境(捆綁軟件,屬性,框架)的bndrun文件,並轉化爲一個獨立的主jar文件。所以你在bndtools中開發和調試,當你感到高興的時候,把它變成一個可執行的jar。例如:

@Component 
public class MyApp { 
    String args; 

    @Activate 
    void activate() { 
     System.out.println("Args: " + args); 
    } 

    @Reference(target="(launcher.arguments=*)") 
    void args(Object object, Map<String,Object> map) { 
     args = (String) map.get("launcher.arguments"); 
    } 
} 

# to turn into an executable 
bnd package myapp.bnd 
java -jar myapp.jar -a somearg *.file 
1

我知道您只搜索了Felix。然後,這個Equinox-only解決方案可能沒有用處。我把它留在這裏,因爲別人可能會偶然發現這個問題並且運行Equinox。

從任何包和任何框架,它可能很難。如果你使用org.eclipse.core.runtime。應用程序擴展點,應該很容易。先決條件:您不要將-console作爲參數傳遞。 plugin.xml中

<plugin> 
    <extension 
      id="myApp" 
      point="org.eclipse.core.runtime.applications"> 
     <application> 
      <run class="package.Application" /> 
     </application> 
    </extension> 
</plugin>