Какой javac использует Netbeans? - PullRequest
       41

Какой javac использует Netbeans?

4 голосов
/ 28 октября 2010

Мой рабочий проект должен быть скомпилирован и запущен под JDK1.5, и я нахожусь на Mac.Я следовал инструкциям здесь , чтобы вернуть 1.5 на Snow Leopard, и он прекрасно работает при сборке из IntelliJ IDEA или если я просто нахожусь в том же каталоге, что и build.xml, и пытаюсь "ant CleanRebuild"Когда я запускаю Target в NetBeans, все они компилируются с неверной версией, что приводит к

java.lang.UnsupportedClassVersionError: Неверный номер версии в файле .class (невозможно загрузить класс ...

когда tomcat пытается запустить.

Итак, все, что я пробовал

  1. Установите для "Java Platform" значение 1,5 в свойствах проекта /библиотеки.
  2. Установите для параметра Source / Binary Format значение JDK 5 в свойствах / источниках проекта.
  3. Указал муравей, который является домом для муравья, которого я использую, в настройках / ant
  4. Переименовывая каждый исполняемый файл javac, который я смог найти в надежде, что NetBeans не удастся скомпилировать, и я смог выяснить, какой из них он использовал (не повезло)
  5. Установка 1.5 по умолчанию, что приводит к необходимости указывать $ netbeans_jdkhoмне на 1.6 jdk для того, чтобы NetBeans мог даже запуститься.

Все неуспешно ....

Опять же, если я войду в каталог проекта netbeans со сборкой.XML и запустить команду вручную все хорошо .... так что NetBeans.В чем дело?

1 Ответ

4 голосов
/ 05 декабря 2010

Исправленный ответ

Допущения: NetBeans версии 6.9.1 (хотя, вероятно, применимо к большинству или всем версиям 6.x), альтернативные системы сборки (например, Maven) не используются ... по умолчанию (Ant) б.

NetBeans по умолчанию использует Ant в качестве своей системы сборки для таких вещей, как компиляция проекта, сборка проекта, очистка собранных файлов из проекта и т. Д. У Ant есть две концепции, которые применимы здесь: цели и задачи. target в словаре Ant - это просто «команда» или серия заданий, которые необходимо выполнить для определенного задания. В NetBeans общими целями являются «Компиляция», «Сборка», «Очистка и сборка» и т. Д. «Задания», которые выполняет цель, это (среди прочего) Ant tasks . В NetBeans одной задачей (которая особенно важна при ответе на этот вопрос) является Javac Task . Это задача, которую Ant использует для компиляции .java файлов в .class файлов.

Проект на основе Ant и, следовательно, проект NetBeans, используют файл build.xml для управления процессом сборки и информирования Ant о том, как выполнить поставленные задачи. В проекте NetBeans build.xml находится в корневом каталоге проекта по умолчанию. Однако в NetBeans используется расширяемый пользователем файл build.xml. Основные цели и задачи, определенные NetBeans, фактически находятся в nbprojects/build-impl.xml и импортируются в build.xml в первых нескольких строках файла. Теория заключается в том, что пользователи могут добавлять или переопределять объекты в build.xml, в то время как основная конфигурация, определенная NetBeans, остается неизменной в файле build-impl.xml.

Если вы посмотрите в файле nbproject/build-impl.xml по умолчанию для проекта Java NetBeans, вы найдете задачу Javac, на которую ссылаются дважды. (Ищите «<javac».) Оба находятся в определениях макросов и, следовательно, находятся в пределах сложностей конфигурации сборки по умолчанию NetBean. Если мы обращаемся к документации Javac Task , мы обнаружим, что задачи используют компилятор в расположении, указанном либо глобальным свойством build.compiler, атрибутом compiler, указанным в задаче <javac... />, либо по умолчанию это компилятор Java, который используется при запуске и, и, следовательно, тот, который используется при запуске NetBeans (потому что именно он запускает процесс Ant). Поскольку мы нигде не видим атрибут build.compiler или compiler (по умолчанию build-impl.xml), мы можем только заключить, что используется значение по умолчанию.

Итак, у нас есть (более или менее правильный) первый ответ. NetBeans компилируется с использованием JDK, который использовался для выполнения NetBeans по умолчанию. Похоже, что он на самом деле немного сложнее, чем этот простой ответ, но по сути он правильный. Если вы посмотрите на документацию по Задаче Javac, то на нее ссылается « класс, который реализует интерфейс CompilerAdapter », который предполагает, что вместо непосредственного вызова исполняемого файла javac Ant (и, следовательно, NetBeans) компилируется с использованием компилятора класс (который, по всей вероятности, также использует исполняемый файл javac). Обратитесь к Оригинальному ответу ниже, чтобы определить, какой JDK использовался для запуска NetBeans.

Итак, что если вы не хотите использовать JDK по умолчанию, который использовался для запуска NetBeans? Вот тут и появляется « Java Platforms ». Перейдите в меню «Сервис» и нажмите «Java Platforms». Скорее всего, здесь определена только одна платформа. (Кроме того, это на самом деле самый правильный ответ на то, что JDK используется по умолчанию ... тот, который определен здесь в Java Platform Manager.) Если вы хотите скомпилировать с другой версией Java (скажем, ваш JDK по умолчанию равен 1.6 , но вы хотите скомпилировать против 1.5), тогда вы должны установить альтернативный JDK где-нибудь в вашей системе, а затем настроить платформу здесь в NetBeans 'Java Platform Manager. (Я оставлю это в качестве упражнения для вас, чтобы найти документацию о том, как добавить платформу Java. Поверхностный поиск по вики не выявил ничего очевидного. В любом случае, это довольно очевидно.)

После создания новой платформы в менеджере вы должны щелкнуть правой кнопкой мыши свой проект на вкладке "Проекты", выбрать "Свойства", а затем "Библиотеки".В верхней части вы должны выбрать подходящую платформу Java для проекта.Как только вы измените это значение и нажмете «ОК», NetBeans внесет несколько изменений в ваш файл build-impl.xml, указывающих на новый JDK, для которого нужно выполнить компиляцию.(По-настоящему увлекательным для нас является создание копии каталога nbproject перед внесением этого изменения и diff, что соответствует новому содержимому каталога nbproject после внесения изменений.)Задача Javac Ant для использования (эквивалентного) исполняемого файла javac указанной платформы.Итак, здесь у нас самый правильный ответ: NetBeans использует эквивалент исполняемого файла javac (как вызывается задачей Ant javac), который указан в расположенной Java-платформе проекта в узле Библиотеки свойств проекта.

Исходный ответ

Путь к JDK, используемому NetBeans, можно найти вфайл netbeans.conf.Найдите запись netbeans_jdkhome.

Вы также можете указать jdkhome во время выполнения (приведен пример * NIX):

netbeans --jdkhome /usr/bin/jdk1.6.0_22

Файл netbeans.conf находится в разных местах в зависимости откакую ОС вы используете.См. NetBeans.conf FAQ в вики NetBeans для получения справки по поиску файла.

Несколько дополнительных комментариев ...

... Вы можете указать -targetопция в свойствах проекта.В NetBeans 6.9 щелкните проект правой кнопкой мыши и выберите «Свойства».Нажмите на узел Compiling .Добавьте вашу -target к Дополнительные параметры компилятора .

... Я читал в нескольких местах, что указание цели не является гарантией того, что код будет работать на JRE, чья версияниже, чем JDK, который его построил.Другими словами, рекомендация выглядит так: если вы хотите 1.5 бинарных файла, то скомпилируйте с 1.5 JDK.

...