Как скомпилировать один / несколько файлов Java без перезагрузки сервера? Есть ли Eclipse плагин для того же? - PullRequest
6 голосов
/ 16 февраля 2009

Я хочу скомпилировать несколько файлов Java в моем приложении без перезапуска Weblogic и Tomcat. В противном случае это займет много времени. Для этого я получил один Hotswap плагин в Eclipse , но это работает не во всех случаях. Это говорит, что это работает для одиночной компиляции файла. Даже если я использую это, это не работает во всех случаях.

Есть ли другой способ, которым я могу это сделать, или есть какой-нибудь другой плагин / скрипт / программное обеспечение, которое может помочь мне в этом?

Если есть несколько открытых программ, это будет очень полезно.

Заранее спасибо.

Ответы [ 6 ]

7 голосов
/ 16 февраля 2009

Одна вещь - это компиляция классов, но вам также нужна виртуальная машина JAVA для перезагрузки классов и их использования, что называется горячей заменой. Для лучшей из доступных «горячей» замены классов вам понадобится что-то вроде javarebel . Это позволяет вам перезагрузить намного больше типов изменений кода , чем обычная JVM SUN. Если вы запускаете развертывание в расширенном режиме, вы свободны дома и можете проверить любое изменение кода примерно за секунду. Мы достаточно ориентированы на тестирование, поэтому я использую javarebel только на том коротком этапе, когда собираю все приложение, но оно работает очень хорошо.

2 голосов
/ 16 февраля 2009

Java HotSpot VM делает это автоматически, но не во всех случаях ...

Во-первых, вы должны запустить сеанс «отладки», а не сеанс «выполнения».

Далее, некоторые изменения приведут к перезапуску. Основная идея состоит в том, что, если интерфейс к классу изменяется (метод sigs, а не фактический интерфейс Java), виртуальная машина не может заменить встроенное содержимое класса.

Для этого вам не понадобится плагин, только недавно установленная виртуальная машина.

Это происходит при нескольких обстоятельствах, таких как

  • методы добавления
  • методы удаления
  • изменение сигнатур метода
  • изменение иерархии классов (суперклассы, реализованные интерфейсы)

Это также может произойти, если вы введете в класс ошибку. (Для ошибок, таких как несоответствующие фигурные скобки)

Когда вы сохраняете файл Java, eclipse компилирует его. Если есть ошибка, Eclipse вставляет исключение, чтобы указать, что есть неразрешенная ошибка компиляции. (Он делает это так, что при запуске вы не просто видите последнюю успешную компиляцию, что делает очевидным наличие ошибки компилятора)

1 голос
/ 16 февраля 2009

Я согласен, что при развертывании очень утомительно все время развертывать.

Я бы посоветовал вам взглянуть на MyEclipse, который имеет очень хороший механизм горячего развертывания, который хорошо работает с Tomcat, и который достаточно доступен и имеет 30-дневную пробную версию.

Стандартный механизм Java EE в Eclipse для повторного развертывания на серверах не так быстр.

1 голос
/ 16 февраля 2009

Я не знаю Eclipse, но я использую Netbeans. Netbeans делает это довольно хорошо. В последней версии даже есть опция автоматической перекомпиляции при сохранении файла Java.

Я знаю, что это не совсем отвечает на ваш вопрос. Вероятно, вы можете использовать как Netbeans, так и Eclipse, в зависимости от того, над какой частью проекта вы работаете.

EDIT: С Tomcat вы можете перезагрузить веб-приложение. Это действительно полезно, только если Tomcat смотрит на новый класс. Если ваш проект сначала компилируется в каталог сборки, а затем из него создается WAR, вы можете зайти в Tomcat и установить веб-приложение, а не указывать на точку WAR в каталоге сборки.

В Tomcat вам, возможно, придется поместить файл конфигурации сайта в tomcat / conf / Catalina / localhost. Содержимое этого файла выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:/Projects/MyWebApp/build/web" path="/MyWebApp"/>

Инструкция по перегрузке здесь: http://www.cs.ucl.ac.uk/teaching/java/tomcatfaq.html#changeservlet

Если вы сделаете это несколько раз, хотя Tomcat не хватит памяти. Это из-за того, что называется PermGenSpace. Читайте об этом, если вы хотите узнать больше. Решение состоит в том, чтобы увеличить память JVM, PermGenSize (с -XX: MaxPermSize) и, наконец, периодически перезапускать Tomcat.

EDIT2: Если после перезагрузки приложения вы выйдете из системы, вы можете легко заставить контейнер сериализовать данные сеанса на диск, добавив в некоторые из ваших классов «Implements Serializable». Тогда вам не нужно входить в систему после перезагрузки приложения.

0 голосов
/ 07 ноября 2009

очень легко сделать, если вы прочитаете эту страницу: Смотри http://blog.redfin.com/devblog/2009/09/how_to_set_up_hot_code_replacement_with_tomcat_and_eclipse.html Спасибо Дэн Фабулич

0 голосов
/ 16 февраля 2009

Наверное, я не понимаю, в чем проблема. Вот что я делаю, и изменения загружаются практически мгновенно. У меня есть скрипт Ant, который компилирует для меня файлы .java и .jsp, помещает их в соответствующие каталоги в разделе webapps и при необходимости изменяет файл web.xml (или, по крайней мере, касается его, чтобы уведомить tomcat об изменениях). Если вам понадобится помощь в выполнении этого с Ant, я был бы рад помочь. Кстати, я не использую WAR-файлы для развертывания на моем тестовом компьютере. Думаю, это будет намного медленнее.

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