Компиляция Java и JAR - PullRequest
       32

Компиляция Java и JAR

1 голос
/ 06 сентября 2011

Я только что задал недавний вопрос о распределении исполняемых JAR-файлов и их зависимостей, и это заставило меня понять, что мое понимание JAR-файлов может быть в корне неверным.

Таким образом, некоторые могут сказать: " Эй, сейчас!Это повторяющийся вопрос!"Но я говорю« нет », этот вопрос является совершенно отдельным ответом этого оригинального вопроса и касается основ Java!

Если у меня естьприложение, которое зависит, скажем, от Apache Commons CLI, а также от JODA Time, и я упаковываю это приложение в распространяемый JAR, мой оригинальный вопрос был: Как не включать JAR CLI и JODA в мой JAR, какпрограмма запускается на стороне клиента ???

Теперь я думаю, что, поскольку мой код, использующий CLI и JODA, скомпилирован в файлы классов, и этот байт-код - это то, что упаковывается, тогданет необходимости включать CLI или JODA (или любой другой сторонний JAR-файл) в мой JAR-файл, так как он теперь работает с байт-кодом.

Может кто-то cподтвердить или поправить меня?Это откровение, хотя и с опозданием, ошеломляет.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Сторонние библиотеки (например, JodaTime) должны находиться в пути к классам во время выполнения. Не "упаковано в ваш JAR".

Если ваше приложение запускается из JAR. Вы должны указать classpath в файле манифеста, который упакован в jar - http://download.oracle.com/javase/tutorial/deployment/jar/downman.html

Вы можете сделать, чтобы ANT сгенерировал для вас путь к классу манифеста, используя элемент manifestclasspath - http://ant.apache.org/manual/Tasks/manifestclasspath.html

1 голос
/ 06 сентября 2011

Нет, это не совсем верно.Ключ ко всему - путь к классам.Находится ли весь скомпилированный код и / или другие ресурсы в пути к классам?Если вы упакуете все в один jar-файл, то да, он находится в пути к классам, и JVM найдет все ресурсы для запуска.В противном случае вам нужно указать (с помощью файла .bat или .sh или чего-то еще) все ресурсы, от которых зависит ваше приложение, поэтому JVM сможет соответствующим образом искать эти ресурсы (будь то код Java или файлы свойств или что-то еще).

Также, если я правильно понял ваш вопрос, вы предполагаете, что код CLI и JODA скомпилирован в ваш код?Если это так, я ненавижу взрывать твой пузырь, но это не тот случай.Когда ваш код компилируется, он не вносит зависимости (не в том смысле, в котором вы, возможно, думаете).То, что он делает на концептуальном уровне (поправьте меня, если я ошибаюсь, гуру JVM) - это ссылки на другие классы.Эти ссылки - то, что вы создаете, когда кодируете класс и компилируете его.Во время выполнения JVM будет пытаться найти скомпилированный класс за ссылкой, и это то, где вам либо понадобится jar с этими классами в пути к классам, ИЛИ вам нужны эти классы в вашем исполняемом jar.*

...