Концепции создания файла класса

1

Я попробовал странный эксперимент. Я создал проект в Eclipse. Я создал Abc.java, который имеет основной метод, который выводит "Hello" на вывод. Затем я построил проект, используя eclipse. Создан файл класса с именем Abc.class. Я скопировал этот файл класса в случайное местоположение. Затем я перешел к файлу класса и использовал следующую команду для его выполнения.

java Abc

Он напечатал "Hello" на консоли. Пока все хорошо. Я предполагаю, что для простого sysout нет зависимостей, которые необходимо разрешить JVM.

Затем я создал очень сложную программу в своем затмении, для которой я должен был включить 15 разных банок (ex slf4j и apache-commons). После создания программы в eclipse я просто скопировал ее файлы классов в другое место (а не JARS). Основной метод, который делает все сложное кодирование, все еще находится в Abc.

Я снова ударил команду (на этот раз я следил за структурой пакета, поэтому мне пришлось вызвать немного другую команду).

java com.great.Abc

У меня создалось впечатление, что, поскольку я не добавлял никаких jars в classpath в java-команду, этот код сломался бы ужасно (помните, что у него было много зависимостей). Однако его работа абсолютно прекрасна.

Может кто-нибудь объяснить, почему?


(Через полчаса: |) Тем временем я попробовал еще один эксперимент, и это еще больше меня поражает. Я отправил все файлы классов, созданные через eclipse, на другой компьютер (обратите внимание, что я не отправил почтовые файлы jar, а только файлы классов, созданные eclipse).

И я запустил программу там, надеясь, что на этот раз он сломается. И угадайте, что, он работает отлично. Любые входы?

Нужны ли банки только во время компиляции? Как я могу гарантировать, что используемые ящики необходимы во время выполнения при создании программы? Пожалуйста, объясните спокойно, как бы глупы ни были вопросы. :)

  • 0
    каким образом вы строите проект?
  • 0
    Если ваш класс com.great.Abc не импортирует эти зависимости, он должен работать нормально.
Показать ещё 2 комментария
Теги:
class
jar

3 ответа

1
Лучший ответ

В Java зависимости между кодами устанавливаются между классами, поэтому, когда вы создаете класс, который просто печатает сообщение, ваша настройка проекта eclipse не имеет значения, если ваш класс не использует какой-либо класс из настройки fancy eclipse.

Даже если ваш класс ссылается на другие классы, может случиться так, что эти классы не загружаются во время выполнения, когда класс на самом деле их не использует.

Даже если вы запускаете Java-программу из файла jar, которая имеет зависимости с другими файлами jar, объявленными в ее манифесте, стандартная Java-пусковая установка будет игнорировать отсутствие одного или нескольких этих файлов jar молча, и во время выполнения программы он будет сообщать только о сбоях если требуемые классы из этой пропавшей банки были загружены.

В одном случае было гарантировано, что ваша программа рано сломается, когда ее суперкласс не присутствует во время выполнения.

1

Jar файлы в сторону, я на самом деле довольно странно, что он даже загрузил ваш класс Abc, поскольку JVM будет искать com.great.Abc только в подкаталоге com/great вашего класса. Я подозреваю, что у вас есть какой-то неявный путь к классам, установленный в вашей среде или что-то еще, что указывает на вашу среду Eclipse и что JVM нашел ее там.

Чтобы проверить это или нет, вы можете запустить Java с помощью -verbose:class, чтобы сообщить, где она загружает классы:

java -verbose:class com.great.Abc
  • 0
    первый файл класса не имел никакой упаковки, второй класс был другим Abc, упакованным должным образом, так что он отвечает на ваш первый запрос. Я смотрю на второй :)
  • 0
    @DipanshuVerma: Это было именно то, что я имел в виду. Поскольку у первого не было пакета, не удивительно, что JVM нашла его. Поскольку у второго был пакет, странно, что JVM нашла его.
Показать ещё 3 комментария
0

Eclipse использует путь Absolute к вашим включенным файлам jar. Даже когда вы перемещаете свой основной класс, он все еще отлично работает

  • 0
    Однако простой файл классов вообще не включает никакой формы пути к классам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню