В чем разница между путем к классу и путем сборки


86

Меня смущают эти два термина.

Также что мне делать, чтобы создать файл в папке src проекта Spring MVC? Когда я создаю с помощью объекта File, он создает файл внутри C: \ SpringSourceTool ... Я думаю, это ClassPath, верно?

Как мне получить applicationcontextпапку или корень приложения?

Ответы:


100

Путь сборки используется для сборки вашего приложения. Он содержит все ваши исходные файлы и все библиотеки Java, необходимые для компиляции приложения.

Путь к классам используется для выполнения приложения. Сюда входят все классы и библиотеки Java, необходимые для запуска приложения Java. Путь к классам является обязательным, путь по умолчанию .используется, если виртуальная машина java не может найти путь, определенный пользователем. ( CLASSPATHпеременная среды, -cpфлаг или Class-Path:атрибут в манифесте jar)


Но javac принимает аргумент пути к классам. Можно ли сказать, что этот параметр «перегружен» для указания пути сборки?
aioobe

4
Нет. Аргумент classpath является подсказкой компилятору, что он должен ожидать, что будет доступно / предоставлено во время выполнения, поскольку вы не создаете каждый класс, который используете сами (например, JFC, библиотеки, ...). Путь сборки содержит зависимости как исходный, так и / или исходный / скомпилированный, а также где их искать.
Йоханнес Вахтер,

При разработке плагина я добавил все необходимые библиотеки в путь к классам, но ничего не смог импортировать. Eclipse не видел их, пока я не добавил их в путь сборки.
Bax

51

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

Путь к сборке не является стандартной терминологией Java. Это термин, обозначающий более богатый способ, которым типичная IDE определяет отношения между «проектами», составляющими приложение. IDE использует это, чтобы определить путь к классам и исходный код для компиляции кода Java, а также путь к классам для его запуска. IDE также использует путь сборки, чтобы выяснить, как упаковать ваш код и его зависимости в виде (например) файла WAR.

Например, путь сборки Eclipse для проекта включает другие проекты, от которых он зависит, и перечисляет все дополнительные библиотечные JAR-файлы, которые проект содержит / использует. В нем также перечислены пакеты текущего проекта, от которых могут зависеть последующие проекты.

(Если вы используете Maven для своего проекта, механизм пути сборки IDE является вторичным по отношению к зависимостям, объявленным в файлах POM. Например, при использовании Eclipse с m2eclipse путь сборки синтезируется из файлов POM.)


27

Путь к классам используется во время выполнения для загрузки скомпилированных классов и ресурсов.

Путь сборки используется во время компиляции, чтобы найти зависимости, необходимые для сборки вашего проекта.


Можно ли сказать, что путь к классу используется для поиска .classфайлов (и других скомпилированных ресурсов), а путь сборки используется для поиска исходных файлов, которые необходимо скомпилировать?
Адам

1
@ Адам Я не думаю, что это полностью правда. Путь сборки иногда требует файлов .class для компиляции исходных файлов. Таким образом, путь сборки также использует негласный путь к классу. Если вы потратите некоторое время на компиляцию и запуск java-проекта с помощью java CLI, вы можете это увидеть. И javac, и java-команда имеют параметр classpath, потому что он может понадобиться им обоим.
intrepistar_88

4

У каждого проекта Java есть собственный путь сборки, в котором указаны все зависимости, необходимые для компиляции проекта. Эти зависимости могут поступать из других проектов Java в рабочей области, из архивных файлов Java .jar или из папок, содержащих файлы .class.

В среде CLASSPATH вам нужно указать только файлы .class (т.е. jar, zip-файлы - внутри jar, zip-файлов вы найдете только java-классы), т.е. вы помогаете виртуальной машине Java (JVM) находить файлы классов Java

Также что мне делать, чтобы создать файл в папке src проекта Spring MVC? Когда я создаю с помощью объекта File, он создает файл внутри C: \ SpringSourceTool ...

Здесь была запущена JVM, если вы хотите создать файл в другом месте, используйте относительный путь отсюда.

См. Это и это для получения дополнительной информации.


В своем ответе вы даже не упомянули путь сборки.
aioobe

4

Я хотел бы добавить к ответу Andreas_D, чтобы объяснить, что путь сборки требуется IDE / компилятору для поиска внешних пакетов и классов, используемых вашим кодом. Иногда мы называем это «зависимостями» .

NB: эти внешние пакеты могут быть упакованы внутри сжатого файла .jar или, действительно, может быть несколько файлов jar, упакованных внутри «библиотеки» . Библиотека или группа библиотек часто составляют «каркас» .

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

С classpathдругой стороны, JVM, выполняющая ваше приложение, сообщает JVM, где найти какие-либо зависимости во время фактического выполнения вашего кода.

Также обратите внимание: путь к классам предназначен для использования JVM.

Buildpath предназначен для использования IDE / компилятором и является средством создания пути к классам из вашей среды разработки. Когда вы настраиваете путь сборки через IDE, вы также настраиваете скрытый файл в своем проекте с именем .classpath. Это используется для предоставления пути к классам JVM при развертывании.


1

Путь к классам ( из Википедии ):

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

Виртуальная машина ищет и загружает классы в следующем порядке:

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

классы расширения: пакеты, которые находятся в каталоге расширений JRE или JDK,

jre / lib / ext / пользовательские пакеты и библиотеки

По умолчанию доступны только пакеты стандартного API JDK и пакеты расширений без необходимости указывать, где их искать. Путь для всех пользовательских пакетов и библиотек должен быть установлен в командной строке (или в манифесте, связанном с файлом Jar, содержащим классы).

Проще говоря, пока ваша программа работает, JVM загружает классы только по мере необходимости. Когда класс необходим, JVM будет зависеть от пути к классам, чтобы знать, откуда загрузить байт-код (например, .classфайлы).

С другой стороны, путь сборки обычно используется IDE, например Eclipse, чтобы знать, где искать дополнительные библиотеки, необходимые для компиляции исходного кода проекта. Путь сборки не используется во время выполнения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.