2010-07-06 28 views
0

我正在研究(Codehaus)Maven 2 Mojo。不幸的是,所謂的邏輯有一個不兼容的許可證,我必須分開一個過程(就像Cobertura maven插件一樣)。是否有一個Java庫將命令文件轉換爲主方法的參數

分叉本身很容易使用org.codehaus.plexus.util.cli.Commandline和朋友。 fork需要能夠將數千個參數設置爲被調用進程的主要方法(這是要使用的第三方代碼)。在Windows上,Commandline只能長8k。使用直接分支(Runtime.getRuntime().exec)僅支持高達32k的總參數大小,這仍然不夠。

所以我需要一個第三方工具的包裝,它從文本文件(命令文件)中讀取行並用它們調用目標類。 這很容易編碼,我可以自己做但我有另一個我的類調用第三方代碼,由於許可問題(如上所述)不能在Mojo的代碼庫本身。最好的將是一個圖書館,我可以拉入作爲依賴,這對我來說。

你知道我可以使用這樣一個圖書館/課程嗎(沒有設置另一個項目,需要發佈bla bla bla)。

+0

「叉需要能夠設置成千上萬的argumends到被調用進程的主要方法」哈哈! – mcandre 2010-07-06 20:21:56

+0

很明顯,它並沒有被設計成從Mojo中使用... – 2010-07-06 20:51:53

+0

我有一種在平行宇宙中存在的奇怪感覺。一個「不兼容」的許可證如何強制你產生一個過程?我的意思是,你的插件可以使用任何許可證,不是嗎? – Riduidel 2010-07-07 07:30:00

回答

0

顯然(沒有人回答),沒有這樣的東西可以使用開箱即用。所以我必須自己想出一個。

  • 要創建我複製net.sourceforge.cobertura.util.CommandLineBuildersource),其中有addArg()saveArgs()getCommandLineFile()方法的命令行文件。
  • 要用該文件執行命令行,我使用了MOJO中常用的org.codehaus.plexus.util.cli.Commandline

    Commandline cl = new Commandline(); 
    cl.setExecutable(COMMAND_CLASS); 
    cl.createArg().setValue(TASK_CLASS); 
    
    CommandLineBuilder builder = new CommandLineBuilder("macker"); 
    for (Iterator/*<String>*/it = options.iterator(); it.hasNext();) { 
        builder.addArg((String) it.next()); 
    } 
    builder.saveArgs(); 
    String commandsFile = builder.getCommandLineFile(); 
    cl.createArg().setValue(commandsFile); 
    
    StringStreamConsumer stdout = new StringStreamConsumer(); 
    StringStreamConsumer stderr = new StringStreamConsumer(); 
    int exitCode = CommandLineUtils.executeCommandLine(cl, stdout, stderr); 
    
  • 「其他」一方必須解開參數。我寫了一個小類CommandLineFilesource)。

    String className = args[0]; 
    Class clazz = Class.forName(className); 
    Method main = clazz.getMethod("main", new Class[] { String[].class }); 
    
    List/*<String>*/lines = new ArrayList/*<String>*/(); 
    Reader in = new InputStreamReader(new FileInputStream(args[1]), "UTF-8"); 
    try { 
        lines = IOUtils.readLines(in); 
    } finally { 
        in.close(); 
    } 
    
    main.invoke(null, new Object[] { lines.toArray(new String[lines.size()]) }); 
    
  • 目前仍然存在的唯一問題是需要CommandLineFile是在類路徑中。但這是另一回事......

所有使用的類是通用的和開源的。所以他們可以用於任何分叉問題。

+0

此源代碼現在位於Apache SVN中:http://svn.codehaus.org/mojo/trunk/sandbox/macker-maven-plugin/src /主/ JAVA /組織/ Codehaus的/魔力/ macker / – 2011-03-18 07:43:12

相關問題