2011-05-18 103 views
17

我正在編寫一個Java應用程序,它接受使用Apache Commons CLI與GnuParser處理的命令行參數。由於不理解的原因,我希望它默默地忽略未知的命令行選項,而不是拋出一個ParseException,但我沒有辦法做到這一點。我看到GnuParser.parse()上有一個stopAtNonOption布爾選項,但是我想要的更像ignoreAtNonOption,它將在遇到未知標記後繼續處理選項。Apache Commons CLI選項解析器可以忽略未知的命令行選項嗎?

我可以實現我自己的解析器來實現這一點,但我很驚訝沒有內置的這個功能,所以我想我會檢查之前走下這條路。

什麼我談論示例代碼:

try { 
    CommandLine commandLine = parser.parse(options, args); 
    // stopAtNonOption set to true (below) is also not what I want 
    // CommandLine commandLine = parser.parse(options, args, true); 
} catch (ParseException e) { 
    LOG.error("error parsing arguments", e); 
    throw new RuntimeException(e); 
} 

回答

25

這對我的作品(其他解析器能也可以派生出來):

public class ExtendedGnuParser extends GnuParser { 

    private boolean ignoreUnrecognizedOption; 

    public ExtendedGnuParser(final boolean ignoreUnrecognizedOption) { 
     this.ignoreUnrecognizedOption = ignoreUnrecognizedOption; 
    } 

    @Override 
    protected void processOption(final String arg, final ListIterator iter) throws  ParseException { 
     boolean hasOption = getOptions().hasOption(arg); 

     if (hasOption || !ignoreUnrecognizedOption) { 
      super.processOption(arg, iter); 
     } 
    } 

} 
+8

這很美麗,謝謝!順便說一句,這應該是任何API設計師關於爲什麼你絕對肯定真的不想讓你的API類最終的說明。爲什麼?因爲你不夠聰明,無法找出客戶端代碼想要重用你的東西的所有方式。 – 2012-05-29 18:50:28

+0

我已經爲BasicParser完成了相同的操作。像魅力一樣工作!肯定應該添加到cli API。 – Dudi 2014-07-18 08:22:58

+1

這是現在不推薦:(。 – Decoded 2016-02-26 04:55:29

0

這是不可能的共享CLI。但是,如果您提供有關您的用例的更多詳細信息,則可能有另一種方法可以實現您期望的結果。

0

我是一個很糟糕的開發者,我這樣做是爲了打破代碼:

public class EasyPosixParser extends PosixParser { 
    @Override 
    protected void processOption(String arg, ListIterator iter) throws ParseException 
    { 
     try { 
      super.processOption(arg, iter); 
     } catch (ParseException e) { 
      // do nothing 
     } 
    } 
} 

在你的主代碼,你這樣做:

CommandLineParser commandlineParser = new EasyPosixParser();