【问题标题】:Class file creation concepts类文件创建概念
【发布时间】:2014-08-11 14:38:21
【问题描述】:

我尝试了一个奇怪的实验。 我在 Eclipse 中创建了一个项目。我创建了 Abc.java,它有一个打印“Hello”到输出的 main 方法。 然后我使用eclipse构建了这个项目。创建了一个名为 Abc.class 的类文件。我将该类文件复制到某个随机位置。然后,我导航到类文件并使用以下命令执行它。

java Abc

它在控制台上打印了“Hello”。到目前为止一切顺利。我假设对于一个简单的 sysout,JVM 不需要解决任何依赖关系。

接下来,我在 Eclipse 中创建了一个非常复杂的程序,为此我必须包含 15 个不同的 jars(例如 slf4j 和 apache-commons)。在 Eclipse 中构建程序后,我只是将其类文件复制到不同的位置(不是 JARS)。 完成所有复杂编码的主要方法仍然是 Abc。

我再次点击了命令(这次我遵循了包结构,所以我不得不调用一个稍微不同的命令)。

java com.great.Abc

我的印象是,由于我没有在 java 命令中的类路径中添加任何 jar,所以这段代码会很糟糕(记住它有很多依赖项)。 但是,它工作得很好。

谁能解释一下原因?


(半小时后:|) 与此同时,我尝试了另一个实验,这让我更加惊讶。我把通过eclipse生成的所有class文件都邮寄到了另一台电脑上(注意我没有邮寄jar文件,只有eclipse生成的class文件)。

我在那里运行程序,希望这次它会中断。 你猜怎么着,它运行完美。有输入吗?

只有在编译时才需要 jars 吗? 在创建程序时,如何确保在运行时需要我使用的 jar? 无论问题看起来多么愚蠢,请冷静地解释。 :)

【问题讨论】:

  • 你以什么方式构建项目?
  • 如果您的 com.great.Abc 类没有导入这些依赖项,那么它应该可以正常运行。
  • com.great.Abc 不会导入这些依赖项,但是它使用同一包中的其他类文件(有关系)。这些其他类文件使用这些依赖项。一切都好吗?
  • @DipanshuVerma:即使其他文件导入了依赖项,它们是否真的使用它们?他们真的创建了其中定义的类的实例吗?

标签: java class jar


【解决方案1】:

在 Java 中,之间建立了代码依赖关系,因此当您创建一个只打印一条消息的类时,只要您的类不使用来自花哨的 Eclipse 设置。

即使您的类引用其他类,也可能会发生这些类在运行时未加载,而该类并未真正使用它们。

即使您从一个 jar 文件启动一个 Java 程序,该 jar 文件依赖于其清单中声明的​​其他 jar 文件,标准 Java 启动器也会默默地忽略这些 jar 文件中的一个或多个不存在,并且在程序执行期间它会仅当尝试从这些缺失的 jar 中加载所需的类时才报告失败。

保证你的程序会提前中断的一种情况是它的超类在运行时不存在。

【讨论】:

    【解决方案2】:

    除了 Jar 文件,我真的觉得很奇怪,它甚至加载了你的 Abc 类本身,因为 JVM 只会在你的类路径的 com/great 子目录中查找 com.great.Abc。我怀疑您以某种方式在您的环境中设置了一些隐式类路径或其他东西,它指向您的 Eclipse 环境,并且 JVM 在那里找到了它。

    要验证是否存在这种情况,您可以使用 -verbose:class 选项运行 Java,让它告诉您从哪里加载类:

    java -verbose:class com.great.Abc
    

    【讨论】:

    • 第一个类文件没有任何打包,第二个类是一个不同的Abc打包正确,这样就回答了你的第一个问题。我正在研究第二个:)
    • @DipanshuVerma:不过,这正是我的意思。由于第一个没有包,JVM找到它并不奇怪。由于第二个有包,奇怪的是JVM找到了。
    • 如果没有明确的类路径,Java 将从当前目录加载。
    • @Holger:当然可以,但是从显式包中加载类仍然会在当前目录的子目录中查找。
    【解决方案3】:

    Eclipse 使用包含的 jar 文件的绝对路径。 即使你移动你的主类,它仍然可以正常工作

    【讨论】:

    • 一个简单的类文件根本不包含任何形式的类路径。
    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多