#java #ubuntu #environment-variables
#java #classpath #javac #dos
Вопрос:
Я пытаюсь заглянуть под капот о компиляции Java. Итак, я отложил свою IDE и начал использовать командную строку MS-DOS…
Я создал простой проект, как описано в дереве ниже :
SampleApp
|____**src**
|_____pack
|______Sample.java
|____**classes**
Это Sample.java исходный код :
public class Sample
{
private String s = new String("Hello, world");
public Sample(){
System.out.println(s);
}
}
Я просто хочу скомпилировать этот класс, поэтому я использовал команду javac :
promptSampleAppsrc>javac -d ..classes -sourcepath . packSample.java
Все работает нормально, но я этого не ожидал, потому что я удалил свою CLASSPATH
переменную окружения перед компиляцией моего Sample.java файл. Итак, я ожидал ошибку компилятора из-за того, что компилятор не сможет найти java.lang.Файл класса String.
Я прочитал эту статью http://www.ibm.com/developerworks/java/library/j-classpath-windows / это помогло мне понять многие вещи. Автор статьи говорит, что по умолчанию classpath является текущим рабочим каталогом. Но я не понимаю, почему мой исходный код компилируется без ошибок. Кто-нибудь может мне это объяснить?
Ответ №1:
Итак, я ожидал ошибки компиляции из-за того, что компилятор не сможет найти java.lang.Файл класса String.
Короткий ответ заключается в том, что компилятор знает, где найти все стандартные классы библиотеки Java SE, без вашего ведома.
Более длинный ответ заключается в том, что String
класс находится по bootclasspath . Это неявно задается javac
командой для ссылки на соответствующие JAR-файлы в установке JDK. javac
Команда выполняет поиск в bootclasspath, прежде чем искать данные в обычном classpath.
Комментарии:
1. Спасибо за ваш ответ. Это действительно помогает мне! Я поищу дополнительную информацию о bootclasspath.
Ответ №2:
Переменная classpath не выполняет то, что вы думаете. Процитировать документацию oracle:
Переменная CLASSPATH — это один из способов указать приложениям, включая инструменты JDK, где искать пользовательские классы. (Классы, которые являются частью JRE, платформы JDK и расширений, должны быть определены с помощью других средств, таких как путь к классу bootstrap или каталог расширений.)
Источник: http://docs.oracle.com/javase/tutorial/essential/environment/paths.html
В принципе, поскольку java.lang.*
это часть платформы и поставляется с JDK / JRE, вы не должны указывать компилятору, где их искать.