【问题标题】:Using Java application launcher使用 Java 应用程序启动器
【发布时间】:2013-08-02 17:01:48
【问题描述】:

我有课Hello。我已经成功地编译了 .class 文件并将其放入 dir/subdir 目录,并在其代码中为其分配了 dir.subdir 包。我想用java 命令从命令行运行它。

我已经用命令运行了它:java dir/subdir/Hello,它运行成功了!但是我在docs 中读到它应该使用完全限定的类名来完成。我尝试执行:java dir.subdir.Hello,它也运行成功了!!

以下哪种方法是合理且更正确的方法?他们每个人的具体含义是什么?它们的根本区别是什么?

【问题讨论】:

    标签: java command-line compiler-construction javac java-launcher


    【解决方案1】:

    你应该使用点的形式,但不是因为平台兼容性。

    参数dir/subdir/Hello 在这里使用是有效的,因为Java 的默认ClassLoader 实现可以正确处理它。但是,并非所有 ClassLoader 实现都支持这一点。您应该使用虚线形式,因为根据ClassLoader.loadClass 中的文档,名称应该是binary names。 JLS 在JLS 13.1 中定义二进制名称,第 1 项:

    类或接口必须以其二进制名称命名,必须满足以下约束:

    • 顶级类型的二进制名称是它的规范名称。

    • 成员类型的二进制名称由其直接封闭类型的二进制名称、$ 和成员的简单名称组成。

    • 本地类的二进制名称由其直接封闭类型的二进制名称、$、非空数字序列和本地类的简单名称组成。

    • 匿名类的二进制名称由其直接封闭类型的二进制名称、$ 和非空数字序列组成。

    • 由泛型类或接口声明的类型变量的二进制名称是其直接封闭类型的二进制名称,后跟$,然后是类型变量的简单名称。

    • 由泛型方法声明的类型变量的二进制名称是声明该方法的类型的二进制名称,后跟$,后跟Java虚拟机规范,Java SE中定义的方法描述符7版,后面是$,后面是类型变量的简单名称。

    • 由泛型构造函数声明的类型变量的二进制名称是声明构造函数的类型的二进制名称,后跟$,后跟Java虚拟机规范,Java SE中定义的构造函数描述符7 版,后面是$,后面是类型变量的简单名称。

    【讨论】:

      【解决方案2】:

      使用包名(带点)更好,因为它是跨平台的(请记住,Windows 使用\)并且更接近于您的程序在 jar 文件中(其中Main-Class必须指定为类名)。

      【讨论】:

      • 但如果我确定它不在罐子里?例如,Linux 是否存在差异?
      • 当您从 jar 启动 Java 程序时,该类不是在命令行中指定的,而是在 jar 的 Manifest 中指定为 Main-Class。最好使用基于点的名称以保持一致性。
      • 这里完全没有跨平台的问题。 Windows和Linux都需要使用/,不能使用`\`
      【解决方案3】:

      您应该始终使用点,因为这适用于所有操作系统(win/unix/mac)。包不过是目录结构,在 windows 中用斜杠 (/) 处理,因此 java 能够运行您的程序而不会出现任何错误。

      【讨论】:

        【解决方案4】:

        一定要使用点,因为它可以跨平台运行。 Mac/Windows/Linux

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 2011-02-23
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          相关资源
          最近更新 更多