Концепции развертывания: зависимости JAR-пакетов, когда и почему - PullRequest
5 голосов
/ 19 сентября 2011

Так что я относительно новичок в Java EE, и мне трудно понять, когда, где и почему файлы развертывания Java упакованы со своими зависимостями.

Скажем, я строю свой проект в myapp.jar , и это зависит от fizz.jar, buzz.jar и JODA (joda-time-2.0.jar).

Я слышал, что загрузчик классов по умолчанию не упаковывает jar-файлы внутри других jar-файлов, поэтому я должен предположить, что если бы я вызвал задачу jar из Ant, то загрузчик классов по умолчанию будет вызван и myapp.jar будет создан без этих 3-х зависимостей.

Это потому, что менталитет заключается в развертывании jar-файлов без 1014 * в контейнерах или других системах, которые будут обеспечивать его требования во время выполнения? Если нет, то как myapp.jar работает правильно?

А как насчет исполняемых фляг? Чтобы встретиться, эти должны отличаться от main без банок, потому что они предназначены, чтобы быть отдельными единицами, верно? Это значит, что им понадобятся все их зависимости, не так ли?

И последнее, но не менее важное: как насчет банок, которые зависят от банок, которые зависят от банок ... и т. Д. (т. е. огромные зависимости)?

Полагаю, все эти вопросы можно сформулировать следующим образом:

  1. Является ли идея неисполняемого jar-файла в том, что он будет запускаться таким образом, что он будет знать, какой путь-класс (ы) искать его зависимости во время выполнения? (И поэтому не нужно упаковывать его с зависимостями)?
  2. Есть ли идея исполняемого файла jar в том, что он является автономным модулем и должен быть упакован с его зависимостями?
  3. Если мое утверждение к вопросу № 1 выше верное, как происходит такая конфигурация пути к классам? Эти параметры хранятся внутри банки (например, в манифесте)? Иначе, как JRE узнает, где искать конкретные зависимости jars во время выполнения?

Ответы на эти вопросы на самом деле прояснят довольно много ошибок, которые я имею с основами Java, и поэтому любой ввод / помощь здесь будет оценена чрезвычайно! Спасибо

Ответы [ 2 ]

5 голосов
/ 19 сентября 2011

Банки не знают о других банках (если только им не помогают такие инструменты, как Maven).Взаимозависимость банок решается исключительно загрузчиками классов.Я настоятельно рекомендую иметь некоторое представление о загрузчиках классов .

Чтобы ответить на ваши вопросы,

Идея, лежащая в основе неисполняемого файла jar, заключается в том, что он будет запущен таким образом, что он будет знать, на какой путь (и) classpath смотретьдля его зависимостей во время выполнения?(И поэтому не нужно упаковывать его зависимости)?

  • НЕТ.Как уже упоминалось, это загрузчик классов, который смотрит путь к классу и упомянутые в нем банки.Банки не имеют никакой информации о других банках.

Есть ли идея, лежащая в основе исполняемого файла jar, в том, что он является автономным модулем и должен быть упакован с его зависимостями?

  • НЕТ.Загрузчик классов загружает автономные исполняемые файлы jar в начале выполнения.Если ему нужны другие jar-файлы зависимостей, он будет искать путь к ним для этих jar-файлов.

Если мое утверждение в вопросе 1 выше верное, как происходит такая конфигурация classpath?Эти параметры хранятся внутри банки (например, в манифесте)?Иначе, как JRE узнает, где искать конкретные зависимости jars во время выполнения?

  • Для автономного jar (исполняемого jar) загрузчик классов ищет переменную classpath OR classpath, переданную при вызовеприложение.
  • Для приложений другого типа (WAR, EAR) существуют предопределенные места / папки, в которые необходимо поместить зависимости, чтобы их можно было подобрать.Это стандартизировано спецификациями.

В двух словах, это загрузчик классов, который тянет все потоки.Есть стандартные места, где он ищет все зависимые банки. Эта ссылка хорошо описывает, как работает загрузчик классов в автономном приложении и в развернутом (в каком-то контейнере).

0 голосов
/ 19 сентября 2011

JAR-файлы - это способ упаковать сложное Java-приложение. Приложение Jar легко перемещается между различными машинами и операционной системой.

Я думаю, что правильный способ использования Jars - это не помещать все (все зависимости) в одну банку.

Например, если ваше приложение использует библиотеку jar (например, jdbc) для доступа к базе данных, вы не должны помещать jar jbbc в вашу банку.

Вам лучше собрать файл jar только с вашим файлом .class.

Конечно, для правильной работы вашему коду нужен jdbc jar. Здесь объясняется, как виртуальная машина ищет внешние классы:

- это первый поиск в каталогах, которые содержат классы, входящие в стандартную комплектацию J2SE (путь зависит от вашей установки)

- поиск в каталогах, указанных в classpath (classpath - это либо переменная окружения, либо опция команды java)

например:

java -jar -c / your / path / yourApp.jar

запустит ваше приложение и будет искать классы, на которые ссылается ваше приложение, в каталоге / your / path /, поэтому, если у вас есть внешние jar-файлы, вы можете поместить их в этот каталог.

Для подробной документации: http://download.oracle.com/javase/tutorial/deployment/jar/index.html

...