#java #javac
#java #javac
Вопрос:
Информация на этой странице содержит несколько полезных советов и общую информацию, но ничего окончательного.
Я знаю, что javac.exe в основном просто запускает ‘sun.tools.javac.Main’ из ‘tools.jar’ с использованием Java. Я также знаю, что классы Java API хранятся в ‘rt.jar ‘в ‘jre / lib’ под JDK. Это где ‘javac.exe ‘загружает классы Java API из?
В частности, меня интересует этот сценарий: предположим, я установил jdk1.6.0_17, а позже я установил jdk1.6.0_25. Если я запускаю ‘javac.exe ‘ из jdk1.6.0_17, будет ли он загружать классы Java API из ‘rt.jar ‘в 1.6.0_17 или 1.6.0_25?
Причина, по которой я хочу знать все это, заключается в том, что я нахожусь в ситуации, когда я знаю, что код, который я компилирую, будет выполняться на определенной (не самой последней) версии Java, и я хочу скомпилировать, используя ту же точную версию javac и Java API для обеспечения совместимости.
Комментарии:
1. Нет ли в вашей IDE возможности настраивать разные сценарии сборки -> например, настроить две разные настройки buiild, используя две разные версии JDK? Я использовал это в NetBeans, и я считаю, что это функциональность, предлагаемая Eclipse. Изменение JAVA_HOME будет работать, но это будет раздражать, если вам придется делать это часто.
Ответ №1:
По умолчанию классы компилируются для начальной загрузки (классы среды выполнения в rt.jar , классы интернационализации в i18n.jar , и другие) и классы расширений платформы, с которыми поставляется javac.Так что да, если вы запустите ‘javac.exe ‘ из jdk1.6.0_17, будет ли он загружать классы Java API из ‘rt.jar ‘в 1.6.0_17, а не из 1.6.0_25.
Но javac также поддерживает кросс-компиляцию, где классы компилируются с использованием классов начальной загрузки и расширений другой реализации платформы Java.
Подробнее см. В разделе: Перекрестная компиляция, если вы хотите использовать
Комментарии:
1. Хороший ответ, короткий и точный. 1!
2. Ах, я предположил, что классы API были чем-то отдельным от классов начальной загрузки и расширений, думаю, мне следовало прочитать более внимательно. Это имеет большой смысл. Перекрестная компиляция может сработать и для меня, спасибо за предложение.
3. Я рад помочь вам, а также помочь вам. 🙂
Ответ №2:
Установите для переменной среды JAVA_HOME желаемый JDK. Также измените переменную среды PATH, чтобы она содержала желаемый каталог JDK bin.
Комментарии:
1. Также обратите внимание, что в Java есть понятие ПУТИ к классу для разрешения общих библиотек, поэтому op может потребоваться соответствующим образом настроить его.
2. Я не думаю, что это окажет какое-либо влияние на javac. Некоторые инструменты, такие как Ant, используют это для определения пути к JDK по умолчанию. Но запрашивающий не указал никакого инструмента сборки.
3. Задействован Ant, но я использую свойства
fork
иexecutable
, чтобы заставить его запускатьсяjavac.exe
как отдельный процесс. У меня возникли проблемы с Ant, пытающимся запуститьjavac
из tools.jar — вот почему я иду на все эти неприятности.4. @KevinK Я думаю, вам не стоит беспокоиться о различии обновлений одного и того же основного выпуска. Что-то, скомпилированное, скажем, с 1.6.0_25, должно быть двоично совместимым с 1.6.0_17. На самом деле, я бы предпочел постоянно компилировать с использованием самой последней версии, поскольку в ней может быть больше исправлений ошибок и исправлений безопасности. Единственным исключением может быть, когда какая-либо реализация API обновляется между версиями, например, как они перешли с JAXB RI 2.0.3 на 2.1.3 с обновления 3 на 4 в JDK 1.6.
5. @G_H Я понимаю, что, вероятно, я здесь параноик. Проблема возникла из-за того, что другой разработчик в команде сообщил об ошибках во время сборки; оказывается, это было потому, что они установили Java 7 JDK на своей машине, и каким-то образом Ant запускал javac из Java 6 ‘tools. jar’ но пытается загрузить классы начальной загрузки из Java 7 rt.jar . Я просто пытаюсь обеспечить согласованную среду сборки.