次のように、メインクラスがなくてもjarファイルを実行できますか?
java -jar my_jar.jar -getX arg1 arg2 ...
getXというメソッドがあり、引数としてarg1arg2...を使用していることがわかります。何か案が?
次のように、メインクラスがなくてもjarファイルを実行できますか?
java -jar my_jar.jar -getX arg1 arg2 ...
getXというメソッドがあり、引数としてarg1arg2...を使用していることがわかります。何か案が?
mainメソッドが必要です。
mainの署名は次のとおりである必要があります。
public static void main(String[] args){
// Insert code here
}
したがって、mainメソッド内でメソッドgetXを呼び出すことができます。
簡単な答えはノーです...しかし...
これは、jarを呼び出すときにコマンドラインでメソッド名とパラメーターを渡すために使用できる手法です。この説明の例では、最初のパラメーターとしてメソッド名を使用します。必要に応じて微調整し、必要に応じてエラーチェック/処理を追加します。
package com.charles.example;
import java.lang.reflect.Method;
public class MethodRouter {
public void myMethod(final String[] args) {
System.out.println("Amazing!! " + args[1]);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
args = new String[2];
args[0] = "myMethod";
args[1] = "yoyo-yada-bla";
}
final MethodRouter methodRouter = new MethodRouter();
final Class<?>[] types = { String[].class };
final Class<?> _class = methodRouter.getClass();
final String methodName = args[0];
final Method _method = _class.getDeclaredMethod(methodName, types);
if (_method != null) {
_method.invoke(methodRouter, new Object[] { args });
}
}
}
出力:
Amazing!! yoyo-yada-bla
mainメソッドを持つクラスが少なくとも1つあるはずです
メソッドを引数として渡すだけでは実行できません。引数を解析する必要があります。必要なメソッドを実行するために引数を自分で解釈する場合-getX arg1 arg2
は、パラメータでメインメソッドに渡されます。args
mainメソッドを持つクラスがMETA-INF/MANIFEST.MF
このようなものでない場合
Manifest-Version: 1.0
Class-Path: .
Main-Class: some.pack.age.MainClass
次に、それを(完全修飾)最初の引数として指定できます。
java -cp my_jar.jar some.pack.age.MainClass -getX arg1 arg2 ...
jarにmainメソッドを持つクラスがない場合、それを実行することはできません。JVMは実行を開始するためのエントリポイントを必要とし、これがメインメソッドです。そのような瓶は単なる図書館です。
なぜこれが必要なのかはわかりませんが、単体テストプロジェクトを設定し、そこからメソッドを呼び出すことができます。これにより、(明示的な)Mainメソッドを使用せずに、(一種の)メソッドを実行できるようになります。
ただし、テストランナーには(暗黙的な?)Mainメソッドが含まれます。これは、メソッドを実行するためのエントリポイントになります。
""を使用してjarを実行する場合java -jar
は、メインクラスを定義する必要があります。この方法で実行できるjarのmainメソッドを定義するmainクラスが必要になります。
ただし、次の構文を使用して、jar内でクラスを実行できます(メインメソッドがある場合)。
java -classpath my_jar.jar com.project.MyClass
jarに動的にリンクし、そこからメソッドを呼び出すプロキシjarを作成できます。ただし、プロキシjarにはmain
メソッドを持つクラスが必要です。