5

Apache Commons CLI ライブラリを使用して、Eclipse プロジェクトのコマンド ライン オプションを解析しようとしています。使用シナリオの例に大まかに従っています。

Eclipse プロジェクトのルートにcommons-cli-1.3.1あるフォルダーにフォルダーを追加しました。lib

これをインポートに追加しました:

import org.apache.commons.cli.*;

そして、これは私のトップにmain

    Options options = new Options();
    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = null;
    try {
        cmd = parser.parse( options, args);
    } catch ( ParseException e1 ) {
        System.err.println( "Unable to parse command-line options: "+e1.getMessage() );
        e1.printStackTrace();
    }

エラーなしでコンパイルされますが、parser.parse呼び出しを実行すると次のエラーが生成されます。

Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.apache.commons.cli.Options.getOptionGroups()Ljava/util/Collection; from class org.apache.commons.cli.DefaultParser

この時点では、クラス ローダーは使用していません。

このエラーはどういう意味ですか? エラーを解決して引数を解析するにはどうすればよいですか?

4

2 に答える 2

6

これは、おそらく依存関係の問題です。

これは、ライブラリの 1 つのバージョン (この場合は 1.3.1) に対してコードをコンパイルし、クラスパスでこのライブラリの古いバージョンを使用して実行すると発生します。

私は今日、commons-cli-1.3.1に依存していたときにまさにこの問題に遭遇しましたが、クラスパスにcommons-cli-1.2がありました(アプリケーションを起動するためにyarn jarを使用したため)

あなたは何をすべきですか?

  1. 上記のように 1.2 にダウングレードしてみてください (これは役に立ちました)。
  2. クラスパスを確認し、commons-cli の別のバージョンを検索します

例外メッセージの本当の意味は何ですか? これは、実行時に一部のコードが、呼び出す権利のないメソッドを呼び出そうとすることを意味します。たとえば、これはプライベート メソッドの呼び出しを試みている可能性があります。通常、これはコンパイル中にキャッチされます。

しかし、たとえば、コードが 1.3.1 では公開されていたが、1.2 では非公開だった関数を呼び出そうとするとします。また、再度 1.3.1 をコンパイルしてクラスパスに 1.2 を指定して起動しようとすると、そのようなエラーが発生します。

それが明確であることを願っています。

于 2016-01-20T22:57:44.463 に答える
0

commons-cli を使用して、ゲームOpenPatricianのコマンド ライン パラメータを処理しています。基本的には 3 つの部分があります。許可されるコマンド ライン引数の定義:

Options opts = new Options();
opts.addOption(HELP_OPTION, "help", false, "Display help");
opts.addOption(OptionBuilder.withLongOpt(VERSION_OPTION)
        .withDescription("Version of this application")
        .create());
opts.addOption(FULLSCREEN_MODE, "fullscreen", false, "fullscreen mode");
opts.addOption(OptionBuilder.withArgName(WINDOWED_MODE)
        .withLongOpt("windowed")
        .hasOptionalArgs(1)
        .withArgName("widthxheight")
        .withDescription("Windowed mode with optional definition of window size like: 1280x780")
        .create());
opts.addOption(GAME_LOCALE, "lang", true, "Specify the locale to use");
opts.addOption(CLIENT_OPTION, "client", false, "Start application in client mode. Currently unused. Either client or server must be specified");
opts.addOption(SERVER_OPTION, "server", false, "Start application in server mode. Currently unused. Either client or server must be specified");

可能なすべてのパラメーターを含むヘルプ メッセージを提供する:

public void printHelp(Options options) {
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp( "OpenPatrician", options );
}

そしてもちろん、引数の解析:

public CommandLine parseCommandLine(Options options, String[] args) {
    try {
        // parse the command line arguments
        CommandLineParser parser = new PosixParser();
        return parser.parse( options, args );
    }
    catch( ParseException exp ) {
        printHelp(options);
        throw new IllegalArgumentException("Parsing of command line arguments failed", exp);
    }
}

ここでは、デフォルトのパーサーではなく PosixPaser を使用していることに注意してください。そのため、動作が異なる場合があります。

于 2015-10-04T14:28:59.677 に答える