Как компилятор Java находит файлы классов, в то время как classpath не задан в качестве пути jdk?

#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, вы не должны указывать компилятору, где их искать.