Answers:
在某些情况下,程序可以以不同的方式运行,并且在调用方式上表现出不同的行为。如果调用vim
as vi
,它将在兼容模式下运行。有时是尝试维护几个相关程序的一个版本-例如mailq
,newaliases
在许多Unix系统上,都是链接到sendmail
这些程序的,以便这些程序保持同步)
Java程序通常被调用为:
%java -jar foo.jar参数 %Java Foo参数
第一个版本是您具有指示主要类的清单文件的位置,第二个版本Foo
在类路径中找到的类中运行main方法。
为Java提供的信息是jar的路径或正在调用的类的名称。
罐子的位置并不重要,不足以作为编写代码的依据(并且实际上并不是原始规范的一部分)。Jar可以用任何名称来命名,并且通常包含版本号。而且,不能保证该类甚至存储在.jar中(可以将其提取出来)。
使用调用Java应用程序-jar
只有一种方法可以输入-清单中定义的类。无法重命名。
使用类名调用它的另一种选择是直接指向执行单元。此外,它不能命名为“乘法”-您不能拥有Bar.class
它的代码,class Foo
否则就无法正常工作。
这应该表明,argv[0]
将C 的信息传递给Java应用程序真的没有意义-它要么是java
,无意义和任意的,要么是被调用的类的名称(即您已经在执行代码了)的(您可以做一些getClass().getEnclosingClass().getName()
绝望的事情...))。
这里有一点,您可以在.jar或类路径中的类中定义多个Main方法。并且您可以让它们的行为有所不同,就像有一系列基于事实的if语句一样argv[0]
。
过去我有类似的代码来java -cp Foo.jar com.me.foo.Test
调用Test
类的Main方法,而不是清单中定义的方法。
java com.me.Foo
为命令行,则该方法com.me.Foo.main(String...)
正在被调用。没有办法解决。而且我知道正在调用的是Foo-没有理由将其保留在argv中。这将纯粹是冗余信息。当然,它可能在超类中,但是我有一个微不足道的机会用所需的命令行调用信息来拦截它-无需将其放在argv中。
foo.exe
。