2011-05-18 14 views
17

Apache Commons CLI kullanılarak GnuParser ile işlenen komut satırı argümanlarını alan bir Java uygulaması yazıyorum. Girmek için ilginç olmayan nedenlerden dolayı, bir ParseException atmak yerine bilinmeyen komut satırı seçeneklerini sessizce görmezden gelmek isterim ama bunu yapmanın bir yolunu görmüyorum. GnuParser.parse() 'da bir stopAtNonOption boolean seçeneğinin olduğunu görüyorum, ancak istediğim, bilinmeyen bir jetonla karşılaştıktan sonra işlem seçeneklerini sürdüreceği ignoreAtNonOption gibi.Can Apache Commons CLI seçenekleri ayrıştırıcı bilinmeyen komut satırı seçeneklerini görmezden geliyor mu?

Bunu gerçekleştirmek için kendi ayrıştırıcımı uygulayabilirim ancak bu işlevin yerleşik olmadığına şaşırdım, bu yüzden o yola gitmeden önce kontrol edeceğimi düşündüm. Ben neden bahsettiğimi için

örnek kod:

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); 
} 

cevap

25

Bu benim için çalışıyor (diğer ayrıştırıcılar can Ayrıca türetilmiş olabilirsiniz:

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

Bu çok güzel, teşekkürler! Btw, API sınıflarınızı nihai olarak gerçekten niçin yapmak istemediğinize yönelik olarak, herhangi bir API tasarımcısı için bir not olmalıdır. Niye ya? Çünkü istemci kodunun, eşyalarınızı yeniden kullanmak için kullanacağı tüm yolları anlayacak kadar akıllı değilsiniz. –

+0

BasicParser için aynısını yaptım. Bir çekicilik gibi çalıştı! Cli API'ye kesinlikle eklenmelidir. – Dudi

+1

Bu şimdi kullanımdan kaldırıldı :(. – Decoded

0

Bu Commons CLI ile mümkün değildir. Ancak, kullanım durumunuz hakkında daha fazla bilgi verirseniz, beklediğiniz sonucu elde etmenin başka bir yolu olabilir.

0

Ben çok kötü bir geliştirici değilim ve kod kırmak için bunu: ana kod

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 
     } 
    } 
} 

yapmanız:

CommandLineParser commandlineParser = new EasyPosixParser(); 
İlgili konular