2012-01-15 81 views
1

有没有办法告诉jvm自动寻找一个条目main方法的类,而不是在调用java ClassWithMainMethod时指定它?java:自动找到一个具有主要方法的类

换句话说,我有许多编译类的目录其中之一有main方法,我只想指定该目录。

+0

凡会找这样一个类的JVM? – Mat 2012-01-15 15:05:05

+5

如果目录中的几个类具有'main'方法会怎么样? – 2012-01-15 15:07:13

+1

Java并不直接这样做,因为Java程序的主要类不在Java目录中,因此您必须启动java进程 - “default”包中的类被认为是不好的实践。实际上,java程序在目录中只有'.class'文件并不常见 - 通常会在应用程序和所需的库中分发一堆'.jar'文件并执行其中的一个,或者提供一个启动器脚本可以更好地控制启动。 – millimoose 2012-01-15 15:14:54

回答

4

不,没有办法做到这一点。你可以创建一个可执行的jar,并且定义罐子清单中的主类是什么,允许你使用

java -jar MyJar.jar 

虽然。

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

你也可以用一个脚本,对你执行相应的命令发布程序:

#startup.cmd 
java -cp ... com.foo.bar.Main 
0

如果您的应用程序是一个.jar文件中,可以指定主类在其清单中

0

如果有多个主类的方法?

我认为你可以创建一个可执行的Jar文件,并在清单文件中指定具有主函数的类。所以,每当用户将运行jar文件。具有主函数的类将被执行。

5

如果在您的方案:

  • 它是好的,执行目录中的第一类文件;
  • 此目录中的类位于默认包中;
  • javap命令可用 - 即您已经安装了JDK,而不仅仅是一个JRE;

,你可以使用以下bash脚本:

#!/usr/bin/env sh 
for classfile in *.class; do 
    classname=$(echo $classfile | cut -f 1 -d '.') 
    echo $classname 
    if javap -public $classname | fgrep 'public static void main(java.lang.String[])'; then 
     java $classname "[email protected]" 
    fi 
done 
+1

这是实际的方法,但请注意,'main'函数也可以用grep调用将会错过的'final'关键字来修饰。另外,根据作者是否写入main(String ... args)或main(String [] args)',签名会有所不同。你必须依靠下面的线来克服这个问题。 您可以在我们的[吊带沙盒项目](https://github.com/prologin/camisole/blob/master/camisole/languages/java.py)中看到我们如何处理。 – zopieux 2017-09-09 13:11:15