2017-12-23 16 views
-3

現時点では、既存のJavaプロジェクトと論争していますが、私の目標は、引数を渡して実行するためのコマンドラインインターフェイスを作成し、いわば。端末から実行するJavaプログラムへのコマンドラインインターフェイスを作成する

私はそうのように、Apache commons cli libraryを使用しています:Eclipseの

import org.apache.commons.cli.CommandLine; 
import org.apache.commons.cli.CommandLineParser; 
import org.apache.commons.cli.DefaultParser; 
import org.apache.commons.cli.HelpFormatter; 
import org.apache.commons.cli.Options; 
import org.apache.commons.cli.ParseException; 

public class CommandLineParameters { 

    public static void main(String[] args) { 
    CommandLineParser parser = new DefaultParser(); 
    Options options = new Options(); 

    options.addOption("a", "abc", true, "First Parameter"); 
    options.addOption("x", "xyz", true, "Second Parameter"); 
    options.addOption("h", "help", false, "Shows this Help"); 

    try { 
     CommandLine commandLine = parser.parse(options, args); 

     System.out.println(commandLine.getOptionValue("a")); 
     System.out.println(commandLine.getOptionValue("x")); 

     if (commandLine.hasOption("h")) { 
     HelpFormatter formatter = new HelpFormatter(); 
     formatter.printHelp("CommandLineParameters", options); 
     } 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

私はRun Configurations...に渡さArguments変更することによって、これを実行することができ、しかし、私は実際にがやりたいだろうか、 "normal"のような方法で、grepまたはipconfigのようなターミナルプログラムからターミナルシェルからこのプログラムを実行できるようにするには、

これはJavaを使用してどのように達成できますか?

注: は、私は、コマンドラインでのプログラムにインターフェースを作るしようとしている、コマンドラインからこのプログラムをビルド/ コンパイルしようとしていませんよ。

+0

通常は、プロジェクトをビルドしてそこから実行するディレクトリにシェルを開いたままにしておきます。 – markspace

+1

コマンドラインの構文自体について質問する場合、コマンドは 'java'と' javaw'であり、[documentation page](https://docs.oracle.com/javase/7/docs/)で説明されています。技術的な点/ツール/ windows/java.html) – markspace

+0

あなたはそれが何を意味しているのか正確には分からないでしょう。 –

答えて

1

の回答がjava -jarコマンドを使用して実行することができるjarファイルを構築する方法について説明します。次の記事では、このような「実行」瓶を取ると(それがjava -jar program.jar./programないで呼び出すことができるようにする)shによって「プログラム」ファイルの実行可能ファイルに変換する方法について説明します。https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

アイデアはそのzipですアーカイブ(jarは基本的にはzipアーカイブのフレーバーです)は、任意のプロローグを持つことができます。プロローグは、ファイルの先頭からzipまでのファイル署名(4文字、最初の2文字は「PK」)までです。 javaがjarアーカイブを読み込むと、そのプロローグ(署名の前のすべて)はスキップされます。

したがって、javaの観点から、そのようなjarは有効なjarになります。しかし、そのプロローグがシェルスクリプトである場合、そのようなjarファイルはシェルインタープリタを使用して実行できるファイルになります。

これは、普通のjarコンテンツの前に、その同じjarアーカイブを引数として持つjava -jarを呼び出すシェルスクリプトを追加できることを意味します。 javaは、jarがプロローグを無視してうれしく実行されます。

記事のプロローグは、次のようになります

#!/bin/sh 
MYSELF=`which "$0" 2>/dev/null` 
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" 
java=java 
if test -n "$JAVA_HOME"; then 
    java="$JAVA_HOME/bin/java" 
fi 
exec "$java" $java_args -jar $MYSELF "[email protected]" 
exit 1 

それはjavaを検索し、必要なパラメータでそれを開始します。これはほんの一例です。あなたのニーズに合うように、javaコマンドを見つけるために使用されるアルゴリズムを調整することができます。

このファイルは、このランチャーシェルスクリプトと、java -jarを使用して実行するjarファイル(メインクラスとマニフェストを含む)を連結したものです。

1

あなたのより良い選択肢は、CLIの引数を受け入れる既存のプログラムの他のメインメソッドを書き直すことですが、そうしたい場合は、プログラムをクラスまたはjarファイルにコンパイルする必要があります

そして、他のJavaプログラムと同様にCLIから実行しますが、ここに-hのような引数を与えます。注:Apache Commons用のクラスパスをここに含める必要があります。

java - cp <classpath> fully.qualified.CommandLineParameters -h 

それとも、あなたはそのマニフェストにメインクラス属性を持つJARとも-RANを持っている場合はApache Commonsのが含まれ、クラス名またはクラスパスを設定する必要はありません。それでも、議論をする。

java -jar jarFile.jar -h 

私はあなたのbashrcにとput in an alias or functionを開き、それは、そのようなls

として、コマンドラインからアクセスする独立したプログラムで、なりたいです。問題の事実は、あなたがjavaを呼び出す必要があります、またはあなたは必ず可能であるGroovyの

$ cat my-ls 
#!/usr/bin/env groovy 
println "Run my other program" 

$ chmod +x my-ls 
$ ./my-ls 
Run my other program 
+0

それは私が意味するものではありません。私はそれが 'ls'のようなコマンドラインからアクセスする独立したプログラムであることを望みます –

+0

javaは使い方が間違っています...または単にエイリアスを –

0

のような異なるJVMのスクリプト言語を使用することができ、あります。パラメータを解析した後、System.inから読み取り、System.outに書き込みます。

package sf; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

public class Sample { 

    public static void main(String[] args) { 
     processArguments(args); 
     try { 
      processInput(System.in); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void processArguments(String[] args) { 
     // whatever 
    } 

    private static void processInput(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      System.out.println(line.toUpperCase()); 
     } 
     in.close(); 
    } 
} 

とそれだけで

java sf.Sample -a <input.txt >out.txt 

ディレクトリのようなタイプを使用し実行するために: - ここでは非常に単純なサンプルが大文字に入力を変換するために、不完全な(エラー処理など)、単に起動する方法を表示しますSample.classが置かれているsfディレクトリがあるディレクトリは、CLASSPATH内にある必要があります。または、javaコマンドの-cpオプションを使用する必要があります。How Classes are Found

+0

と言います。私はそれを 'ls'のようなコマンドラインからアクセスする独立したプログラムにします。 –

+1

@ s.matthew.english" java -jar "と入力しないことを意味しますか?私はそれが可能であるかどうかはわかりません、あなたはJVMインタプリタを呼び出さなければなりません。 – markspace

+0

私はそれをコマンドラインから呼び出すことができる普通のプログラムにしたいだけです - それは可能でなければなりません –

0

は、あなたのJavaコードから実行可能なjarファイルを作成する必要があります。Eclipseの右に

  1. は、フォームに必要事項を記入あなたのメインのファイル
  2. 選択肢Export-> excecutable jarファイルをクリックしてください。コマンドラインからアプリケーションを起動し

    テスト

から「起動設定」実行コンフィギュレーションのために取る:

java -jar CommandLineParameters.jar --param1 -param2 ... 
+0

私は自分のbashプロファイルの内側に私のパスにこのjarファイルを追加することができますし、 'ls'や' grep'でできるだけノーマリーにターミナルから呼び出すことができる方法はありますか? –

+0

はい。クラスパスを定義する必要があります。 https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html – slawek

関連する問題