java:自动查找具有main方法的类

java:自动查找具有main方法的类,java,javac,Java,Javac,有没有一种方法可以告诉jvm自动查找具有条目main方法的类,而不是在调用JavaClassWithMainMethod时指定它 换句话说,我有一个包含许多编译类的目录,其中一个有main方法,我只想指定那个目录。不,没有办法这样做。您可以创建一个可执行的jar,并定义jar清单中的主类,允许您使用 java -jar MyJar.jar 不过 看 您还可以使用脚本交付应用程序,该脚本为您执行适当的命令: #startup.cmd java -cp ... com.foo.bar.Main

有没有一种方法可以告诉jvm自动查找具有条目
main
方法的类,而不是在调用
JavaClassWithMainMethod
时指定它


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

不,没有办法这样做。您可以创建一个可执行的jar,并定义jar清单中的主类,允许您使用

java -jar MyJar.jar
不过

您还可以使用脚本交付应用程序,该脚本为您执行适当的命令:

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

不,没有办法。您可以创建一个可执行的jar,并定义jar清单中的主类,允许您使用

java -jar MyJar.jar
不过

您还可以使用脚本交付应用程序,该脚本为您执行适当的命令:

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

如果应用程序位于.jar文件中,则可以在其清单中指定主类

如果应用程序位于.jar文件中,则可以在其清单中指定主类

如果有多个具有main方法的类


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

是否有多个带有main方法的类

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

如果在您的场景中:

  • 可以在目录中执行第一个类文件
  • 此目录中的类位于默认包中
  • 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 "$@"
    fi
done
如果在您的场景中:

  • 可以在目录中执行第一个类文件
  • 此目录中的类位于默认包中
  • 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 "$@"
    fi
done

JVM会在哪里寻找这样一个类?如果目录中的几个类都有
main
方法呢?Java并不是开箱即用的,因为Java程序的主类位于您必须启动Java进程的目录中不是很常见,因为类位于“默认”目录中包装被认为是不好的做法。事实上,一个java程序在一个目录中只包含
.class
文件甚至并不常见——您通常将一堆
.jar
文件与应用程序和所需库一起分发,然后执行其中一个,或者提供一个启动程序脚本,以便对启动进行更多的控制。@Daniel Fischer在我的场景中,如果调用任何一个启动程序都不可行。您可以编写一个程序来搜索软件中的主方法,然后编写清单文件。JVM会在哪里寻找这样一个类?如果目录中的几个类都有
main
方法怎么办?Java不会开箱即用地这样做,因为Java程序的主类位于您必须启动Java进程的目录中不是很常见,因为类位于“默认”目录中包装被认为是不好的做法。事实上,一个java程序在一个目录中只包含
.class
文件甚至并不常见——您通常将一堆
.jar
文件与应用程序和所需库一起分发,然后执行其中一个,或者提供一个启动程序脚本来更好地控制启动。@Daniel Fischer在我的场景中,如果调用任何一个启动程序都不合适。您可以编写一个程序来搜索软件中的主方法,然后编写清单文件。这是实际的方法,但是请注意,
main
函数也可以用
final
关键字修饰,您的grep调用将错过该关键字。此外,根据作者编写的是
main(String…args)
还是
main(String[]args)
,签名将有所不同。你必须依靠下面这条线来克服另一个问题。您可以在我们的中看到我们是如何处理的。这是实际的方法,但请注意,
main
函数也可以用
final
关键字修饰,您的grep调用将错过该关键字。此外,根据作者编写的是
main(String…args)
还是
main(String[]args)
,签名将有所不同。你必须依靠下面这条线来克服另一个问题。你可以看到我们是如何处理这件事的。