Создать файл JAR во время выполнения - PullRequest
6 голосов
/ 15 декабря 2011

Я только что создал простое Java-приложение, которое будет генерировать классы сущностей для нашей базы данных. Эти Java-классы я сохраню на свой локальный диск. Пока все отлично работает.

Теперь я хочу сгенерировать файл JAR из этих классов Java в моем основном приложении. Я знаю, что могу манипулировать файлами JAR, а также читал о добавлении классов в файл JAR во время выполнения.

Но в моем случае у меня нет классов в моем пути сборки. Что мне нужно, так это создать файлы классов из моих только что созданных java-файлов и поместить их в мой jar-файл.

Возможно ли это в моем Java-приложении?

Причина, по которой я это делаю, заключается в том, что наша база данных будет постоянно расширяться многими людьми, и я не хочу добавлять эти поля в свою сущность вручную. Поэтому я хотел создать приложение, которое сканирует systables из нашей базы данных и генерирует из этой информации файлы сущностей java. Но теперь мне нужно скомпилировать эти java-файлы в файлы классов после их генерации и добавить их в мой окончательный jar-файл.

Спасибо за любую помощь и / или информацию по этому вопросу.

много поздравлений, Hauke ​​

1 Ответ

10 голосов
/ 15 декабря 2011

См. Класс java.util.jar.JarOutputStream (и множество примеров использования в Интернете).Например:

FileOutputStream fout = new FileOutputStream("c:/tmp/foo.jar");
JarOutputStream jarOut = new JarOutputStream(fout);
jarOut.putNextEntry(new ZipEntry("com/foo/")); // Folders must end with "/".
jarOut.putNextEntry(new ZipEntry("com/foo/Foo.class"));
jarOut.write(getBytes("com/foo/Foo.class"));
jarOut.closeEntry();
jarOut.putNextEntry(new ZipEntry("com/foo/Bar.class"));
jarOut.write(getBytes("com/foo/Bar.class"));
jarOut.closeEntry();
jarOut.close();
fout.close();

Конечно, ваша программа, скорее всего, проверит файловую систему и проследит каталог и файловую структуру, чтобы сгенерировать имена и содержимое записей, но в этом примере показаны ключевые функции.Не забудьте правильно обработать исключения и закрыть потоки в блоке finally.

Также помните, что файл манифеста - это просто запись в "META-INF/MANIFEST.MF", котораяпросто текстовый файл с правилами форматирования согласно спецификации файла манифеста .

Компиляция ваших исходных файлов Java в файлы классов на лету - это отдельная задача, чреватая своими собственными сложностями, но классjavax.tools.JavaCompiler является хорошей отправной точкой.Этот вопрос также является хорошим введением: Как программно скомпилировать и создать экземпляр класса Java?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...