我有类Hello
。我已经成功编译了.class文件,并将其放在dir/subdir目录中,并在其代码中为其分配了dir.subdir包。我想用命令java
命令来运行它。使用Java应用程序启动器
我用命令运行它:java dir/subdir /你好它运行成功!但我在docs中读到它应该用完全合格的类名完成。我试图执行:java dir.subdir.Hello它也成功运行了!
以下哪种方法是正确的方法,更正确?他们每个人的具体含义是什么?他们的根本区别是什么?
我有类Hello
。我已经成功编译了.class文件,并将其放在dir/subdir目录中,并在其代码中为其分配了dir.subdir包。我想用命令java
命令来运行它。使用Java应用程序启动器
我用命令运行它:java dir/subdir /你好它运行成功!但我在docs中读到它应该用完全合格的类名完成。我试图执行:java dir.subdir.Hello它也成功运行了!
以下哪种方法是正确的方法,更正确?他们每个人的具体含义是什么?他们的根本区别是什么?
使用软件包名称(带点)更好,因为它是跨平台的(请记住,Windows使用\
),并且更接近于您的程序需要的jar文件所需的内容(其中Main-Class
必须是指定为类名称)。
您应该使用虚线形式,但不是因为平台兼容性。
参数dir/subdir/Hello
在此处有效,因为Java的默认ClassLoader
实现正确处理它。但是,并非所有的ClassLoader
实现都支持这一点。您应该使用虚线形式,因为根据ClassLoader.loadClass
中的文档,名称应该是binary names。该JLS定义JLS 13.1二进制名,第1项:
类或接口必须由它的二进制名称来命名,必须符合下列限制:
顶级的二进制名称类型是它的规范名称。
成员类型的二进制名称由其立即封闭类型的二进制名称组成,后跟
$
,后跟简单名称的成员。本地类的二进制名称由其立即封闭类型的二进制名称组成,后跟
$
,后跟一个非空的数字序列,接着是本地类的简单名称。匿名类的二进制名称由其立即封闭类型的二进制名称组成,后跟
$
,后跟非空的数字序列。由泛型类或接口声明的类型变量的二进制名称是其立即封闭类型的二进制名称,后跟
$
,后跟简单名称的类型变量。由泛型方法声明的类型变量的二进制名称是声明该方法的类型的二进制名称,后跟
$
,后面跟随Java虚拟机规范Java SE中定义的方法描述符7版,其次是$
,后面跟着这个类型变量的简单名称。由泛型构造函数声明的类型变量的二进制名称是声明构造函数的类型的二进制名称,后跟
$
,后面跟着Java虚拟机规范Java SE中定义的构造函数的描述符7版,其次是$
,后面跟着这个类型变量的简单名称。
你应该总是使用点,因为这适用于所有的操作系统(WIN/UNIX/MAC)。包只是目录结构,在Windows中用斜杠(/)处理,所以Java能够运行你的程序没有任何错误。
绝对使用它的点然后能够跨平台运行。 Mac/Windows/Linux
但是,如果我确定它不在一个罐子里?例如,Linux的差异? –
从jar中启动Java程序时,该类不是在命令行中指定的,而是在jar的'Manifest'中指定为'Main-Class'。为了保持一致性,最好使用基于点的名称。 – chrylis
这里根本没有跨平台的问题。在Windows和Linux上都需要使用'/',否则不能使用'\\' – Brian