Компилировать исходные файлы Java против запуска JVM из Java
Компиляция исходного кода Java изнутри java - это задача, которой помогают инструменты компилятора Java в пакете javafx.tools. Однако есть кое-что, о чем я не могу найти никакой информации.
Вопрос, который я задаю, состоит в том, возможно ли скомпилировать файлы Java с использованием JVM, используемой для его компиляции. Я пишу код, который работает на программном обеспечении, использующем несколько библиотек jar, некоторые из которых довольно большие, и я намерен динамически компилировать отдельные файлы java и загружать полученные файлы классов для работы почти как язык сценариев. Чтобы скомпилированные java-файлы могли обращаться к классам и переменным в программном обеспечении, при сборке ему необходимо добавить все те же библиотеки в свой путь к классам, иначе я столкнусь с ошибками компиляции.
Я искал информацию о том, возможно ли это или нет, и не могу найти ее, я получаю совершенно неуместные результаты.
Если это невозможно, я могу связать все необходимые библиотеки (более 30), я бы предпочел не делать этого. Если невозможно выполнить компиляцию в соответствии с текущей средой, то, что вы считаете самым простым способом динамического получения списка всех библиотек, загружаемых в JVM?
Изменить: В ответ на Джим, я понимаю, что файлы Java скомпилированы в файлы классов и что файлы классов загружаются. Я понимаю, что библиотеки должны быть доступны для компилятора и т. Д. Я утверждаю, что у меня более 30 библиотек общим объемом более 380 МБ, и у меня есть пара сотен отдельных исходных файлов Java в папке, которая расширяет класс определяется в основной программе, которая будет использоваться в качестве модуля. Если мне придется связать все несколько сотен из них с 380 МБ файлов для компиляции, это займет много времени. Я мог бы собрать их все вместе, чтобы решить большую часть проблемы, но основная проблема заключается в том, что список запускаемых файлов добавляется в аргумент -classpath командной строки, и это может измениться в любое время, поэтому я не могу трудно код это. Вот почему существует вторая часть вопроса: как мне получить путь к классу, используемый для запуска текущей программы, чтобы потом передать его в компилятор?
1 ответ
Когда вы используете Compiler API, вы указываете ClassLoader, который вы хотите использовать. Затем этот ClassLoader предоставляет все классы, которые могут вам понадобиться для компиляции кода. Я не могу вспомнить детали, но я написал библиотеку для компиляции Java-кода в памяти около 5 лет назад. https://github.com/OpenHFT/Java-Runtime-Compiler