Java: магия отражений. Часть III. Компиляция Java средствами Java: :Журнал СА 2. ДАНИИЛ АЛИЕВСКИЙJava: магия отражений. Часть III. Компиляция Java средствами Java. В предыдущих частях статьи мы познакомились с технологией отражений (Java Reflection). Это мощнейший механизм Java, позволяющий делать с . При желании можно даже подменить стандартный механизм загрузки Java- классов и взять этот процесс под полный контроль, например, разрешить перезагружать изменившиеся версии . Java- машины (эта техника подробно рассматривалась в части II, см. Системный администратор»). В этой части статьи мы научимся компилировать Java- код в . Не знаю где скачать компилятор для Java. еще несколько софтин. javac. exe (сам компилятор) и еще парочка для упаковки в JAR. Java Development Kit, сокращенно JDK — бесплатно распространяемый фирмой Sun комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac). Javac -d bin src/com/qwertovsky/helloworld/HelloWorld.java Ошибка возникла из-за того, что для компиляции нужны файлы с исходными. JDK - Среда для Ява разработчиков, официальный сайт (Бесплатно) Для Windows Устанавливается по умолчанию в директорию C:\Program Files\Java Путь до компилятора. Скачал книгу по яве, дошел до первой компиляции и тут появилась первая сложность. Если у тебя компилятор javac в корневой папке тогда сработает. . Скачать Java SE Development Kit. Java Development Kit состоит из компилятора Java, стандартных библиотек классов Java, примеров . То же самое можно сделать для компилятора Java ( javac): Выбор компилятора, используемого по-умолчаню можно сделать точно. Совместно с технологией отражений это позволит в процессе исполнения программы «на лету» создавать новые классы в виде исходного текста, компилировать их, загружать и использовать. Столь мощные возможности обычно присущи лишь чисто интерпретируемым, сравнительно медленным языкам типа Java. Script или Perl или Ассемблеру (точнее, машинному языку). Всюду далее, если не оговорено обратное, мы будем подразумевать последнюю (на момент написания статьи) версию Java фирмы Sun: Sun Java SDK 1. Ответ - Java JDK download и установка. 1:42 описание и настройка вызова программ java.exe и javac.exe из пакета JDK. 3:48 написание. . В первом случае будет вызван компилятор javac.exe, а во. 1. javac Main.java . Скачать видео уроки по android-программированию и . Java Development Kit (JDK) — бесплатно распространяемый комплект разработчика приложений на языке Java. Java Development Kit состоит из компилятора Java.. Как скомпилировать Java- файл с исходным текстом. Решение, вообще говоря, совершенно банально – вызвать стандартный компилятор javac! На первый взгляд подобное решение кажется неизящным, сопряженным с массой проблем. Например, компилятор придется поставлять всем вашим пользователям. Другой пример – интеграция компилятора с вашей системой: сообщения компилятора должны выдаваться не на системную консоль, а «внутрь» вызывающей программы для обработки и визуализации в рамках вашего пользовательского интерфейса. Разработчики Java позаботились о том, чтобы эти проблемы легко решались. Прежде всего, стандартный компилятор javac входит в комплект поставки Sun Java SDK, распространяемого совершенно бесплатно. Правда, здесь есть одна тонкость. При формировании дистрибутива Java- приложения обычно принято включать в этот дистрибутив некий фрагмент Java SDK, так называемый JRE (Java. TM Runtime Environment) – набор файлов, достаточный для запуска Java- приложения. В комплекте Sun Java SDK этот набор оформлен в виде подкаталога jre/. По умолчанию JRE не содержит компилятора javac (и ряда других полезных утилит из Java SDK). Включать в дистрибутив полный пакет Java SDK запрещено лицензионным соглашением фирмы Sun. Однако в том же лицензионном соглашении специально оговорено, что компилятор байт- кода javac вместе с необходимым вспомогательным JAR- файлом tools. JRE, точнее, распространять совместно с Java- приложением. См. файл jre/license в комплекте поставки Sun Java SDK 1. Java. TM 2 runtime environment (j. README. txt, раздел «Redistribution of Java 2 SDK Files». Но самое приятное заключается в том, что в действительности компилятор фирмы Sun реализован на том же языке Java – в виде класса com. Main и пакета вспомогательных классов, размещенных в архиве tools. Утилита javac является всего- навсего «оболочкой», стартующей виртуальную машину Java и запускающей указанный класс. Архив tools. jar, как и саму утилиту javac, разрешается свободно распространять (в дополнение к стандартному JRE) совместно с Java- приложением. Это означает, что для компиляции Java- класса из Java- приложения нет необходимости обращаться к внешней утилите javac средствами операционной системы (методами Runtime. Runtime(). exec(..)). Можно напрямую воспользоваться классом com. Main. Использование класса com. Main предельно просто. Вот полный интерфейс этого класса (конструктор и public- методы): // Constructorspublic Main()// Methodspublic static void main(String[] p. String[] p. 0)public static int compile(String[] p. Print. Writer p. 1)Для вызова компилятора нужно обратиться к к одному из двух его static- методов compile. В качестве аргумента p. String[] {"- d","/путь_к_подкаталогу","myfile. В качестве аргумента p. Таким образом можно «перехватить» все сообщения компилятора и перенаправить их в свой собственный буфер, который впоследствии можно проанализировать или показать пользователю. В качестве результата оба метода возвращают стандартный код возврата утилиты javac (errorlevel в терминах MS- DOS). Приведем пример вызова компилятора путем обращения к классу com. Main: String[] args= параметры утилиты javac; Char. Array. Writer writer= new Char. Array. Writer(); int result= com. Main. compile(args,new Print. Writer(writer,true)); if (result!=0) { /* - произошла какая- то ошибка */ анализируем и, возможно, показываем пользователю строку сообщений компилятора writer. String()}Описанное решение очень просто, удобно и эффективно. Но у него есть серьезный недостаток. Класс com. sun. tools. Main, как и все классы из пакетов com. Приведенное выше описание использования класса опирается на здравый смысл и эксперименты, а не на официальную документацию фирмы Sun. Фирма Sun имеет полное право в очередной версии Java SDK изменить поведение или интерфейс этого класса или даже вообще исключить его. Указанная проблема не надумана. Действительно, все сказанное выше справедливо лишь для версии Sun Java SDK 1. В предыдущей версии, Sun Java SDK 1. Main имел совершенно другой интерфейс: // Constructorspublic Main()// Methodspublic static void main(String[] p. String[] p. 0)Метод compile не был статическим, т. Также отсутствовала версия метода, позволяющая указать собственный поток для сообщений компилятора. В версии Java SDK 1. Java обычно использовался другой класс, sun. Main (расположенный все в том же архиве tools. Этот класс также позволяет указать свой поток для сообщений компилятора. Причем этот класс полностью сохранил свой интерфейс при переходе от версии SDK 1. SDK 1. 4. Класс sun. Main имеет нестатический синхронизованный метод compile: public synchronized boolean compile(String[] p. Поток для сообщений компилятора указывается в качестве первого параметра конструктора: public Main(Output. Stream p. 0, String p. Print. Writer, а более «архаичный» Output. Stream). Смысл второго параметра конструктора я так и не выяснил, но найденные мной в Интернете примеры использования данного класса передавали в качестве p. Код возврата утилиты javac возвращается отдельным методом: public int get. Exit. Status()Факт успешности компиляции можно также узнать по boolean- результату метода compile (false означает неудачу). Но и этот класс, несмотря на сохранение интерфейса, в действительности изменил свое поведение при переходе от версии SDK 1. SDK 1. 4. Во- первых, он был объявлен как устаревший («deprecated»). Конечно, предупреждение компилятора, появляющееся при попытке использовать данный класс («warning: sun. Main in sun. tools. Но фирма Sun почему- то решила добавлять аналогичное предупреждение в любое сообщение, выдаваемое самим компилятором sun. Main! Если попытаться использовать sun. Main для компиляции любого, даже совершенно корректного Java- файла, в любом случае будет выдано предупреждение «sun. Main has been deprecated». Чтобы избавиться от него, sun. Main придется использовать с ключом «- nowarn», но тогда вообще теряется возможность получать и анализировать предупреждения компилятора. Во- вторых, в версии Sun Java SDK 1. Main попросту не всегда адекватно работает. На простых тестах это трудно обнаружить. Но когда я попытался скомпилировать с помощью этого компилятора все исходные тексты большого Java- проекта, обнаружилось, что некоторые сложные, но вполне корректные классы, прекрасно компилируемые «штатными» компиляторами и классом com. Main, не компилируются с помощью sun. Main. В частности, компилятор sun. Main «сломался» на некоторых нетривиальных случаях перегрузки методов с аргументами примитивных типов, а также при попытке объявить метод to. String() у некоторого вложенного класса. Это очень похоже на внутреннюю ошибку компилятора, которую фирма Sun не сочла нужным исправлять в устаревшем наборе классов. Есть также мелкие отличия в самом синтаксисе языка Java, понимаемом компиляторами sun. Main и стандартным com. Main. (Ошибка, о которой ранее шла речь, не связана с этими мелкими отличиями – там действительно имела место явная ошибка компилятора.) Например, sun. Main разрешает импортировать (предложением import) конкретные классы, расположенные в корневом пакете – т. CLASSPATH. Стандартный компилятор в современных версиях Java не допускает такого экзотического импорта – все импортируемые классы должны лежать внутри какого- либо пакета. Также можно заметить, что в версии Sun Java SDK 1. Main работает примерно вдвое медленнее, чем com. Main. Все сказанное означает, что использование для компиляции Java- файлов конкретных классов типа com. Main или sun. tools. Main – рискованное занятие. Соответствующий код придется заново тестировать при выпуске каждой новой версии Java SDK и, возможно, в какой- то момент его придется радикально переписывать. В случае com. sun. Main лично мне риск не кажется слишком большим. Похоже, что в этом классе фирма Sun наконец «довела до ума» решения, существовавшие в предыдущих версиях Java в этом же классе и в sun. Main. Трудно представить, чтобы возможности класса com. Main в какой- то версии исчезли или радикально поменялись. Скорее всего, этот класс либо сохранится, либо превратится в легальный документированный класс, например, в пакете java.*, тогда необходимые изменения будут минимальны. Если необходимо надежное документированное решение, то на сегодня единственный доступный вариант – вызвать внешнюю утилиту javac одним из методов Runtime. Runtime(). exec(..). Для этого, правда, эту утилиту нужно еще найти в файловой системе. Если данная утилита входит в состав дистрибутива и инсталлируется вместе с Java- приложением, то инсталлятор может сам позаботиться о том, чтобы полный путь к утилите javac передавался в Java- программу. Если же приложение дожно работать под управлением «чужого» Java SDK, инсталлируемого пользователем независимо от приложения, то можно поискать файлы: bin/javac. Microsoft Windows); bin/javac (случай Unix/Linux); bin/sparcv. Solaris SPARC)в каталоге System. Property(«java. home») и содержащем его каталоге. Чаще всего System. Property(«java. home») соответствует подкаталогу jre/ в главном каталоге Sun Java SDK.
0 Comments
Leave a Reply. |
Details
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |