Каков наиболее эффективный способ разработки веб-приложений Java? Или, если быть более точным, скажем, приложения Wicket?

это мой первый раз, когда я задаю вопрос здесь, я постараюсь сделать свой вопрос максимально ясным.

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

Framework: Apache Wicket 1.4.16
IDE: eclipse Galileo с подключаемым модулем m2eclipse
Инструменты сборки: Maven 2
Доступ к данным: EclipseLink 2.1.1 через JPA 2.0 (со StaticWeave)
СУРБД: MSSQL 2005 или выше с jTDS
DI: Google Guice 2.0
разработка веб-контейнера: сервер Jetty, встроенный в подключаемый модуль Maven Jetty.
Целевой веб-контейнер: Tomcat 6.x или выше

Я использую плагин maven Jetty для тестирования своих веб-приложений, включаю JPDA, в то время как требуется трассировка точности строки.

Всякий раз, когда в исходные коды вносятся изменения, мне приходится перезагружать приложение, чтобы оно вступило в силу. нажмите ENTER, чтобы перезагрузить, все в порядке, но после нескольких перезагрузок (около 3 ~ 5 зависит от моих настроек PermGen) выдается исключение OutOfMemoryException, после чего мне приходится выключать и снова запускать приложение. Я знаю, что автоматическая перезагрузка может быть достигнута с помощью конфигурации, но это приводит только к более быстрому OOME (из-за избыточных перезагрузок).

После поиска в Google я понимаю, что есть проблемы с утечкой памяти. Я пытался увеличить настройки MaxPermSize, но оперативная память на моей установке ограничена, и нецелесообразно устанавливать что-то действительно большое. Кстати, обнаружение утечек памяти введено в Tomcat 7, и я обнаружил, что большинство утечек памяти происходят из jTDS, Google Guice и самой Wicket, но я ничего не могу с этим поделать.

Есть ли что-нибудь, что я могу сделать, чтобы ускорить мой процесс разработки? Чтобы сократить время перезагрузки, я должен перейти на более продвинутый веб-контейнер, такой как Glassfish (извините, я не могу позволить себе WebLogic или WebSphere здесь) или что-то в этом роде.

Заранее спасибо, любые комментарии приветствуются!


person mickey    schedule 22.04.2011    source источник
comment
Я использую JRebel (zeroturnaround.com/jrebel), это действительно очень помогает. Мне все еще приходится время от времени перезапускать сервер, но большинство изменений просто работают. Он идеально подходит для такой Java-ориентированной среды, как Wicket. Вы также можете попробовать DCEVM (ssw.jku.at/dcevm), если у вас есть ' взломанная версия JDK для разработки.   -  person tetsuo    schedule 22.04.2011
comment
OMG... Я никогда раньше не знал, что есть что-то вроде JRebel или DCEVM! Мне не терпится опробовать эти решения прямо сейчас, но это семейные выходные! Большое спасибо! Я проверю это в рабочие дни!   -  person mickey    schedule 22.04.2011
comment
@tetsuo Кстати, почему я не могу отметить ваш комментарий как ответ?   -  person mickey    schedule 22.04.2011
comment
Цитата: Кстати, обнаружение утечек памяти введено в Tomcat 7, и я обнаружил, что большинство утечек памяти происходят из jTDS, Google Guice и Wicket, но я ничего не могу с этим поделать. В чем именно проблема в Wicket? Мы (разработчики Wicket) не знаем ничего, что могло бы вызвать утечку ClassLoader.   -  person martin-g    schedule 23.04.2011
comment
@ marting-g Я думаю, что он говорит о OOME при частом повторном развертывании. Может быть результатом поведения центрального реестра e. грамм. Драйверы БД и тому подобное. В InfoQ есть очень хорошая презентация по этой теме.   -  person Axel Knauf    schedule 23.04.2011
comment
@ martin-g: извините, что был так груб, чтобы сделать такое заявление, я не знаю, как обнаруживать утечки памяти, но Tomcat 7 время от времени сообщает предупреждение об утечках памяти, или, может быть, это неправильное суждение Tomcat 7. @Axel Knauf: Вы правы в том, о чем я говорю, спасибо, что разъяснили.   -  person mickey    schedule 24.04.2011
comment
@mickey Я просто не думал об этом как о хорошем, полном ответе на твой вопрос. Ну, репостнул как ответ, если хочешь отметить :)   -  person tetsuo    schedule 24.04.2011


Ответы (2)


Я использую JRebel, это действительно очень помогает. Мне все еще приходится время от времени перезапускать сервер, но большинство изменений просто работают. Он идеально подходит для такой Java-ориентированной среды, как Wicket. Вы также можете попробовать DCEVM, если у вас есть "взломанная" версия JDK для разработки.

person tetsuo    schedule 24.04.2011
comment
Извините, у меня не хватило репутации, чтобы проголосовать за этот ответ. Я пробовал JRebel и DECVM, DECVM не всегда работал, но JRebel крут! Впервые я думаю, что сторонний продукт должен быть совместным как официальный. - person mickey; 26.04.2011

У меня есть простая оболочка Jetty для запуска веб-приложения в eclipse. Если я запускаю его в режиме отладки, перезагрузка не требуется, если только я не изменю сигнатуры методов или имена полей. Перезагрузка контекста не требуется.

    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.webapp.WebAppContext;

    public static void main(String[] args) {
       Properties properties= ...//read properties from text file
       Server server = new Server(properties.getPort());
       WebAppContext webapp = new WebAppContext(
              properties.getWebApplicationPath(), properties.getContextPath());
    server.start();
       //.... and here can be key capture for stopping Jetty

    }

где properties.getWebApplicationPath() - это ./WebContent (или, возможно, что-то другое, в зависимости от структуры вашего проекта maven).

Это не устраняет утечки памяти при развертывании в Tomcat, но может быть очень полезным в процессе разработки. Я также использую Wicket и Guice, и я не заметил утечек памяти.

person vinga    schedule 23.04.2011
comment
Спасибо за ваш ответ, но модификации сигнатур методов и даже новые классы всегда вводятся во время цикла разработки, кажется, что JRebel или DCEVM являются лучшими решениями. - person mickey; 24.04.2011