LINUX.ORG.RU

Glassfish 4 не дает задеплоить *.war

 , , ,


1

2

Есть примерно следующий код:

public interface Bean {..}
public abstract class AbstractBean implements Bean {..}
@SpecificBean
@Stateless
public class SpecificBean extends AbstractBean {..}

@Path("resource")
public class MagicService {
    @Inject
    @SpecificBean
    private Bean bean;
}

@SpecificBean, как вы уже наверное догадались, Qualifier. Все это добро собирается в *.war и ручками через веб интерфейс Glassfish деплоится. Но задеплоить не получается, потому как Glassfish упорно ругается следующим текстом:

An error has occurred Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [IterableProvider<InjectionResolver<Object>>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 2 of [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.internal.inject.JerseyClassAnalyzer(@Named ClassAnalyzer, IterableProvider<InjectionResolver<Object>>)].

Если все аннотации (кроме @Path) убрать, приложение деплоится, но толку от этого, конечно, совсем мало. Что я делаю не так?

P.S. Java EE 7, Glassfish 4.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 3)

видимо он как и я запутался в аннотациях))))) На сколько я понимаю, чтобы «инжектить» зависимость, надо объяснить weld где её брать, и как. Плюс. Зачем одновременно пользовать наследование и композицию?

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

Вроде бы CDI и сам все знает, а Qualifier @SpecificBean решает все путаницы с несколькими реализациями. В абстрактном классе просто часть общего кода между несколькими бинами.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от ii8_

Пардон, не указал, AbstractBean и есть abstract.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от migesok

Похоже, что все дело в guava'e, от которой зависит jersey https://code.google.com/p/guava-libraries/issues/detail?id=1433, но следующий beans.xml меня почему-то не спасает:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:weld="http://jboss.org/schema/weld/beans"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd
                           http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd">

    <weld:scan>
        <weld:exclude name="com.google.**"/>
    </weld:scan>
</beans>
Если попытаться задеплоить приложение с этим beans.xml, ошибка уже другая:

An error has occurred Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)].

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Если сгенерировать simple-service-webapp, как написано там https://jersey.java.net/documentation/latest/user-guide.html#new-webapp, то оно тоже не деплоится

Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)].

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от ii8_

Думаю, что можно. Завтра посмотрю более внимательно, спасибо. Но все-таки чертовски интересно, что за дерьмо мне угробило выходные на поиск решения.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Просто в glassfish по умолчанию же используется jersey. Тогда там не должны деплоиться никакие rest сервисы на jersey...

Может сам рыбий глаз 4й ещё сыроват? Я стараюсь тестировать ещё и на jboss, когда натыкаюсь на подобную херню.

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

Тогда там не должны деплоиться никакие rest сервисы на jersey...

Почему?

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от ii8_

Кстати, сервис из архетипа (в get started написан) деплоится через раз, действительно похоже на проблему в glassfish'е. Но еще проблема есть в guava 14, которую использует jersey. Там какая-то фигня с cdi, которую пофиксили в 15-й версии.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Здорово. Но я погуглил, поддержка java ee 7 там появится только в 8-й версии, которая сейчас только beta.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Не подскажешь, в чём проблема. Из NetBeans 7.4 не могу развернуть WAR в JBoss AS 7.2. Нужно сделать какие-то каталоги доступными для записи WAR-файлов или можно обойтись стандартной процедурой аутентификации пользователя (Management User'а или Application User'а)?

Сам сервер приложений установлен из-под root'а в /usr/local/, доступа на запись в каталоги нет. Его копия в домашнем каталоге WAR-деплой принимает, так как все каталоги доступны на запись.

iZEN ★★★★★
()
Ответ на: комментарий от vertexua

По логам выходит, что нет доступа на запись к каталогам установки сервера (запуск сервера из среды):

JAVA_OPTS already set in environment; overriding default settings with values: -Xms128m -Xmx512m -XX:MaxPermSize=256m
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /usr/local/jboss-as-7.2.0.Final

  JAVA: /usr/local/openjdk7/bin/java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -Xms128m -Xmx512m -XX:MaxPermSize=256m

=========================================================================

java.lang.IllegalArgumentException: Failed to instantiate class "org.jboss.logmanager.handlers.PeriodicRotatingFileHandler" for handler "FILE"
	at org.jboss.logmanager.config.AbstractPropertyConfiguration$ConstructAction.validate(AbstractPropertyConfiguration.java:118)
	at org.jboss.logmanager.config.LogContextConfigurationImpl.doPrepare(LogContextConfigurationImpl.java:333)
	at org.jboss.logmanager.config.LogContextConfigurationImpl.prepare(LogContextConfigurationImpl.java:290)
	at org.jboss.logmanager.config.LogContextConfigurationImpl.commit(LogContextConfigurationImpl.java:299)
	at org.jboss.logmanager.PropertyConfigurator.configure(PropertyConfigurator.java:505)
	at org.jboss.logmanager.PropertyConfigurator.configure(PropertyConfigurator.java:96)
	at org.jboss.as.logging.logmanager.ConfigurationPersistence.configure(ConfigurationPersistence.java:128)
	at org.jboss.logmanager.LogManager.readConfiguration(LogManager.java:300)
	at org.jboss.logmanager.LogManager.readConfiguration(LogManager.java:262)
	at java.util.logging.LogManager$2.run(LogManager.java:285)
	at java.util.logging.LogManager$2.run(LogManager.java:283)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.util.logging.LogManager.readPrimordialConfiguration(LogManager.java:283)
	at java.util.logging.LogManager.getLogManager(LogManager.java:265)
	at java.util.logging.Logger.<init>(Logger.java:264)
	at java.util.logging.Logger.<init>(Logger.java:260)
	at java.util.logging.LogManager$RootLogger.<init>(LogManager.java:1317)
	at java.util.logging.LogManager$RootLogger.<init>(LogManager.java:1315)
	at java.util.logging.LogManager$1.run(LogManager.java:196)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.util.logging.LogManager.<clinit>(LogManager.java:173)
	at org.jboss.modules.Main.main(Main.java:313)
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.jboss.logmanager.config.AbstractPropertyConfiguration$ConstructAction.validate(AbstractPropertyConfiguration.java:116)
	... 21 more
Caused by: java.io.FileNotFoundException: /usr/local/jboss-as-7.2.0.Final/standalone/log/server.log (Permission denied)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
	at org.jboss.logmanager.handlers.FileHandler.setFile(FileHandler.java:154)
	at org.jboss.logmanager.handlers.PeriodicRotatingFileHandler.setFile(PeriodicRotatingFileHandler.java:105)
	at org.jboss.logmanager.handlers.FileHandler.setFileName(FileHandler.java:192)
	at org.jboss.logmanager.handlers.FileHandler.<init>(FileHandler.java:122)
	at org.jboss.logmanager.handlers.PeriodicRotatingFileHandler.<init>(PeriodicRotatingFileHandler.java:73)
	... 26 more
При заранее запущенном сервере запуск приложения из среды завершается:
Ошибка при развертывании: Запуск Сервер приложений JBoss завершился сбоем. Точка присоединения HTTP 8080 уже используется.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Советую Jboss ставить в home, в root директориях ниразу нормально не заводилось, искать каким папкам нужен доступ в лом)))

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

Пока ничего, но я не думаю, что начинать новое приложение на старой жабке это хорошая идея. К тому же, если верить официальному туториалу, в ней можно отлично обходиться без левых xml-ников, только на аннотациях. Например, в EE 6 для CDI обязательно нужно было иметь хотя бы пустой beans.xml, а в 7 достаточно аннотировать инжектируемый бин @RequestScoped и больше ничего не нужно. Другое дело, что сейчас оно у меня ничего не работает :-)

f1xmAn ★★★★★
() автор топика

Убрал из зависимостей Jersey (он уже есть в glassfish 4) и теперь деплоится нормально. Только CDI не работает :-)

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Ну как после фикса логов завелось?

В смысле? Фикс пока что один: каталоги сервера отдать в собственность/разрешить на запись пользователю, который деплоит на сервер свой WAR/EAR.

Вообще же, меня интересует также вопрос о возможности деплоймента Java EE приложений на работающий сервер (в том числе удалённо, с нескольких рабочих мест). Чтобы при очередном деплойменте сам сервер не запускался/не перезагружался, а работал безостановочно, подхватывая на лету деплоящиеся WAR/EAR. Такое возможно с JBoss? И, естественно, хотелось бы ограничить (оставить без изменения) права на служебные каталоги сервера.

Сейчас смотрю, NetBeans 7.4 с GlassFish 4.0 работает в «инкрементном» режиме, когда сервер приложений постоянно в работе, а на него можно периодически деплоить/андеплоить разрабатываемое приложение, что сильно сказывается на скорости разработки и отладки. JBoss же при каждом деплое приложения и его запуска перезапускается, тратя на свой запуск по 5-7 секунд.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от vertexua

Нет, это не то.

Видимо проблема в самой среде NetBeans — её собственнные средства деплоймента не рассчитаны на безостановочную работу стороннего сервера приложений JBoss. Только родной сервер приложений Glassfish поддерживается в «разогретом» виде. Проблема конечно решается через maven'изацию проекта, gradle'изацию и т.д., то есть без прямой интеграции сервера приложений со средой NetBeans.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от iZEN

Это совсем не плохой выход. Наоборот, распространять исходники в виде проекта среды разработки это совсем хреновая идея.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

NetBeans не делает привязку проектов к себе. Она работает с Ant-сборщиком: в корне каталога проекта есть пятистрочный (не считая комментария) build.xml, в котором прописан импорт файла nbproject/build-impl.xml. В последнем есть сообщение: «Please build using Ant 1.7.1 or higher.». Где тут нужда в NetBeans? Среда только генерирует этот и другие файлы сборки для Ant и управляет запуском таргетов. Хочешь — запускай build.xml с нужными таргетами в Ant из командной строки самостоятельно — NetBeans тебе не понадобится.

Лично моё (да и не только) мнение в том, что в XML-файлы не нужнолазать руками, это формат для машинной обработки. Хоть само содержимое файла человеко-читаемо, но отвратительно для быстрого понимания и тем более редактирования. Maven пошёл по тому же пути, что и Ant, делая малопривлекательной работу по программированию сборки и управлением жизненным циклом проекта. В этом его огромный минус. Но сейчас пробивает себе дорогу Groovy-инструмент с таким же функционалом, что и Maven, но с более человечным синтаксисом описания задач по управлению проектом — Gradle. И его поддержка в NetBeans уже есть.

iZEN ★★★★★
()

@SpecificBean, как вы уже наверное догадались, Qualifier.

ГДЕ? Из приведённого кода ничего не ясно. Попробовал создать твои сущности в NetBeans — пишет ошибки в объявлении классов и аннотаций.

Объясни, что ты хочешь получить в итоге? Может какой-нибудь прототип классов на заглушках выложишь, чтобы хотя бы компилятор не ругался?

iZEN ★★★★★
()
Ответ на: комментарий от f1xmAn

В Java EE 7 он не нужен.

Уверен? Может всё-таки для CDI нужен простой WEB-INF/beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
согласно JSR 299?

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Любая среда разработки, умеющая maven, почти полностью нивелирует недостатки xml. В Intellij IDEA можно написать код с используемой зависимостью, а потом при помощи нескольких хоткеев эту зависимость добавить в <dependencies/>. Также при создании модуля всегда можно указать groupid, artifactid, version и даже сгенерировать модуль из архетипа, причем не обязательно из стандартного. maven чертовски хорош в своем деле, а годная интеграция со средой разработки превращает работу с ним в сказку.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от iZEN

ГДЕ? Из приведённого кода ничего не ясно

Это простейшее приложение, написанное на коленке для примера, очевидно что никаких «крутых» аннотаций тут нету. А из

как вы уже наверное догадались, Qualifier

становится очевидно, что это Qualifier :)

Попробовал создать твои сущности в NetBeans — пишет ошибки в объявлении классов и аннотаций

Значит ты что-то сделал не так.

Объясни, что ты хочешь получить в итоге? Может какой-нибудь прототип классов на заглушках выложишь, чтобы хотя бы компилятор не ругался?

В этом нет нужды, я ведь уже отметил тему решенной, а чуть выше в комментариях написал в чем дело.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Не знаю, зачем тут описывать Maven в контексте «текстового редактора» Intellij IDEA (мы-то на самом деле знаем, что программисты используют IDEA только лишь как хороший редактор кода, а управляют процессом сборки/отладки из командной строки :)) ). Maven полностью сынтегрирован с NetBeans 6.7 летом 2009г. Можно посмотреть обзорчик, как это было от версии к версии, здесь: http://wiki.netbeans.org/MavenBestPractices Инструменты сборки, доступные в NetBeans к настоящему времени, описаны тут: https://netbeans.org/features/java/build-tools_ru.html

Создание Java EE приложения с использованием Maven в NetBeans: https://netbeans.org/kb/docs/javaee/maven-entapp.html

(Насколько убога Intellij IDEA в плане юзабилити можно заметить, что такое элементарное контектно-зависимое действие как «Закрыть проект» («Close Project»), выполняемое над корневым узлом выбранного проекта, можно осуществить только командой из главного(!) меню («File» -> «Close Project»). Во всплывающем меню IDEA над корневым узлом проекта присутствуют всевозможные команды, но только не эта. :)) )

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 2)
Ответ на: комментарий от f1xmAn

Зачем Intellij IDEA создаёт рядом с каждым pom.xml какой-то левый файл имяпроекта-модульпроекта.iml, где перечисляются в XML все нужные зависимости? Причём здесь: http://adyadchenko.blogspot.ru/2012/08/intellij-idea.html сказано:

Их также можно и нужно добавлять в svn.

Это ж бред. Есть каталог среды .idea внутри каталога проекта, где и нужно все служебные файлы среды хранить относительно проекта.

Пример одного такого файла (в дереве таких несколько):

<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5" inherit-compiler-output="false">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Maven: org.appfuse:appfuse-service:2.0.2" level="project" />
    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.6.0" level="project" />
    <orderEntry type="library" name="Maven: org.aspectj:aspectjrt:1.6.0" level="project" />
    <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache:1.4.1" level="project" />
    <orderEntry type="library" name="Maven: net.sf.jsr107cache:jsr107cache:1.0" level="project" />
    <orderEntry type="library" name="Maven: backport-util-concurrent:backport-util-concurrent:3.1" level="project" />
    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1" level="project" />
    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2" level="project" />
    <orderEntry type="library" name="Maven: javax.mail:mail:1.4" level="project" />
    <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
    <orderEntry type="library" name="Maven: velocity:velocity:1.4" level="project" />
    <orderEntry type="library" scope="RUNTIME" name="Maven: velocity:velocity-dep:1.4" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-java5:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-aegis:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-core:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: wsdl4j:wsdl4j:1.6.1" level="project" />
    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.3" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.woodstox:wstx-asl:3.2.0" level="project" />
    <orderEntry type="library" name="Maven: jdom:jdom:1.0" level="project" />
    <orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.4" level="project" />
    <orderEntry type="library" name="Maven: net.java.dev.stax-utils:stax-utils:20040917" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-annotations:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.7.0" level="project" />
    <orderEntry type="library" name="Maven: xfire:xfire-jsr181-api:1.0-M1" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-spring:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: org.apache.xbean:xbean-spring:2.8" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.xfire:xfire-xmlbeans:1.2.6" level="project" />
    <orderEntry type="library" name="Maven: xmlbeans:xbean:2.2.0" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-aop:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-beans:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-core:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-aspects:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-context:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.3" level="project" />
    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-core-tiger:2.0.1" level="project" />
    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:2.0.1" level="project" />
    <orderEntry type="library" name="Maven: log4j:log4j:1.2.13" level="project" />
    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.0.5" level="project" />
    <orderEntry type="library" name="Maven: org.appfuse:appfuse-hibernate:2.0.2" level="project" />
    <orderEntry type="library" name="Maven: org.appfuse:appfuse-data-common:2.0.2" level="project" />
    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-tx:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-orm:2.5.4" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate:3.2.6.ga" level="project" />
    <orderEntry type="library" name="Maven: javax.transaction:jta:1.0.1B" level="project" />
    <orderEntry type="library" name="Maven: asm:asm-attrs:1.5.3" level="project" />
    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
    <orderEntry type="library" name="Maven: antlr:antlr:2.7.6" level="project" />
    <orderEntry type="library" name="Maven: cglib:cglib:2.1_3" level="project" />
    <orderEntry type="library" name="Maven: asm:asm:1.5.3" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-annotations:3.3.0.ga" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-commons-annotations:3.3.0.ga" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.jmock:jmock:2.4.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.jmock:jmock-junit4:2.4.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: junit:junit-dep:4.4" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:2.5.4" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.subethamail:subethasmtp-wiser:1.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.subethamail:subethasmtp-smtp:1.2" level="project" />
  </component>
</module>

Это сгенерировано на основе архетипа Maven приложения «AppFuse Modular Application - Web (JSF)» в Intellij IDEA 13 Community Edition. Причём несколько раз вылезал диалог «перезагрузите проект для чего-то там». :) Руками ничего пока не редактировал — только смотрел дерево каталогов создавшегося проекта.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от f1xmAn

Для мышевозников IDEA — сплошное мучение. :(

В IDEA не сразу нашёл, как сделать переформатирование кода в редакторе. В Eclipse это в контектном меню окна редактирования: «Source» → «Format». В NetBeans в контекстном меню редактора кода есть пункт «Формат Alt+Shift+F», никуда вбок в подпункт курсором уходить не нужно, показывается комбинация горячих клавиш — удобней некуда.

Из контекстного меню Eclipse в редакторе кода можно сразу же попасть в настройки редактора, а в IDEA для этого нужно открыть отдельное окно настроек «Settings...» из главного меню «File» или жмакнуть по кнопке с иконкой инструментов на тулбаре (интересно, зачем она там маячит и место занимает?). В NetBeans в настройки редактирования нужно идти из меню «Сервис» → «Параметры» → вкладка «Редактор».

Так говорите, что IDEA «действительно понимает контекст»? ;)

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Идея настолько крута, что код в ней пишется исключительно альт+табом :)
Я не знаю, куда в ней мышкой тыкнуть надо, чтобы отформатировать код, в каких менюшках находится рефакторинг и другие нужные штуки, потому что мышку в ней использую только для запуска maven'а. Да-да, я работаю с maven'ом из идеи и, насколько мне известно, все в моем офисе тоже :)

Тут (материалы с jeeconf 2013) есть запись выступления одного крутого девелопера из jetbrains, который показывает некоторые интересные фичи идеи, т.ч. если интересна эта тема, то строго рекомендую к просмотру.

Уговаривать переходить на идею я не хочу, мне банально лень. Если ты находишь нетбинс или эклипс удобными, это реально круто — у меня не получилось. Более того, после нескольких месяцев написания прошивок для атмеги в эклипсе, я его просто ненавижу. А идея мне сразу понравилась и вот я уже больше года только её и использую.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Идея настолько крута, что код в ней пишется исключительно альт+табом :)

В NetBeans — Ctrl+пробел. ;)

Тут (материалы с jeeconf 2013) есть запись выступления одного крутого девелопера из jetbrains, который показывает некоторые интересные фичи идеи, т.ч. если интересна эта тема, то строго рекомендую к просмотру.

Конечно, посмотрю.

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

Я нахожу удобным интеграцию инструментов в Eclipse и NetBeans. В IDEA я нахожу только продвинутый редактор кода на хоткеях, которые ещё нужно как-то запомнить (подсказки глубоко запрятаны).

В Eclipse и NetBeans легко и непринуждённо орудуется мышкой, но при желании можно оставить мышь и перейти на хоткеи — они отображаются вместе с пунктами контекстного меню и со временем запоминаются.

Во всех презентациях, связанных с IDEA, я только и вижу, как в IDEA пишется код, а запускается откуда-то из другого места — чаще из командной строки терминала, щелчком по командам Ant или Maven в окне представления управления жизненным циклом. А зачем нужна IDE, если идеисты обходятся без возможностей, которые IDE должна представлять (интеграцию и управление)? Ведь в нормальной IDE можно не только редактировать код, но и активировать возможности баз данных, серверов приложений, Web-сервисов, связывать их между собой через мастера и/или графическим представлением с помощью линий, рисуемых мышью. При этом получается автоматически сгенерированный исходный код, заведомо лишённый опечаток и логических ошибок, свойственный ручному набору.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от f1xmAn

По просмотренному сравню NetBeans с IDEA.

Тут (материалы с jeeconf 2013) запись выступления одного крутого девелопера из jetbrains, который показывает некоторые интересные фичи идеи

Demo 1

Создание кода с нуля

1) Ощущение от направленности IDEA на чистое редактирование кода не покидает. Начиная от того, что ведущий убрал с глаз долой все ненужные на его взгляд элементы интерфейса, оставив только меню, строку состояния и область редактирования.

2) Создание нового кода. Он начал с пустого проекта, добавил новый класс Java. В NetBeans мне пришлось создать проект Java Application с помощью мастера. Новый класс (с методом main(...)) создался автоматически, но не суть. В IDEA пункт контекстного меню для создания нового класса находится на первом месте, в NetBeans — на втором уровне вложенности: «Новый» → «Класс Java...», но зато первый уровень меню имеет всего 6 пунктов, предназначенных для работы с проктом, а в IDEA чего там только нет (мастодонт Tapestry, например).

3) Добавление метода main(...) в класс. Используется шаблон кода, вызываемый набором начальных букв «psvm» (от public static void main) с последующим нажатием клавиши Tab. Как это ни удивительно, но в NetBeans это тоже работает — появляется характерная конструкция метода с правильным позиционированием курсора (с отступом от начала метода внутри тела).

4) Дополнение кода. В IDEA увидел 4 вида дополняющих инструментов: Basic, SmartType, Cyclic Expand Word, Cyclic Expand Word (Backward). В NetBeans только один, но во всплывающем окне выбора дополнений есть чёткое разделение на область высоковероятного совпадения дополнения (аналог SmartType дополнения) и область списка (аналог Basic), в котором в алфавитном порядке перечислены допустимые дополнения, причём одновременно отображается и JavaDoc по выбираемому дополнению в отдельной области (сверху).

5) Автоматическое завершение строки. Строка:

BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
Редактор IDEA по хоткею автозавершает строку ";". В NetBeans же нужно переместить курсор за завершающую кавычку, выйдя из редактирования имени файла, перед скобкой по нажатию на Enter автоматически производится позиционирование курсора для ввода второго аргумента конструктора BufferedReader (ожидается ввод параметра int sz для перегруженной версии конструктора, который не был выбран ранее). В итоге ещё раз нужно вывести курсор за скобку, чтобы вручную поставить ";". Таким образом IDEA справляется с задачей автозавершения строки лучше, так как требует заметно меньше нажатий на клавиши.

6) Сокращённый ввод. На примере сокращённого ввода строки кода

reader.close()
в NetBeans аналога не нашёл. Нужно писать re, нажимать Ctrl+Space, первой строкой выбора будет контектно-допустимое значение «reader» уже активированное для выбора, нажатие Etner дополняет имя объекта до reader; точка вызывает дополнение для метода close(), который, опять же, идёт первым в списке дополнений и заранее активированный; нажатие Enter завершает дополнение всей конструкции.

7) Подсказка о необходимости обработки исключения. В IDEA по нажатию Alt+Enter предлагается два способа: добавить trows в сигнатуру метода и окружить (что — непонятно) блоком try/catch. В NetBeans предлагается три варианта, один из которых совпадает с тем, что и в IDEA, а второй и третий варианты конкретизирует, что именно должен окружить блок try/catch: отдельную конструкцию или весь блок кода метода. В этом отношении NetBeans лучше справляется. Блоки import обновляются и там и там одинаково.

8) Присвоение значения новой переменной. На примере строки

List<String> strings = new ArrayList<String>();
NetBeans справляется хуже: хоткей Alt+Enter после new ArrayList<String>() даёт выбор из двух пунктов: Присвоить возвращаемое значение новой переменной и Настроить подсказку. Последующий Enter преобразует строку к виду:
ArrayList<String> arrayList = new ArrayList<String>();
с установкой курсора в конце имени переменной arrayList. В IDEA срока преобразуется к виду
List<String> strings = new ArrayList<String>();
что более абстрактно с позиции присваивания объектов, также среда представляет имя strings для имени переменной.

9) Дополнение блока условий while в IDEA производится быстрее. В NetBeans нужны дополнительные нажатия клавиш.

10) Дополнение конструкций присвоения. Строку

String[] array = lines.toArray(new String[lines.size()]);
NetBeans, в отличие от IDEA, не может сформировать самостоятельно, так как не обладает магией предсказателя и телепата.

11) Формирование строки Arrays.sort(array); В NetBeans тоже нужно два раза активировать дополнение кода (Alt+Enter+Enter).

12) Шаблоны кода для цикла for в NetBeans для строк в качестве параметра не определены, так что IDEA тут её обходит.

13) Jump to Navigation Bar — странная идея в IDEA. Хотя при закрытых всех необходимых для этого навигационных панелях ничего другого не остаётся, как идти в главное меню и в простыне искать команду вызова однократного отображения попапа с кнопкой создания нового файла. :)) Но в NetBeans нужно пройти путь мастера создания пустого файла.

<Продолжение следует>

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 4)
Ответ на: комментарий от f1xmAn

По просмотренному сравню NetBeans с IDEA (продолжение).

Demo 2

Рефакторинг кода для написания тестов

14) Реорганизация кода примера в NetBeans и IDEA практически один-в-один, не считая, конечно, отличий в интерфейсе диалоговых окон.

15) Автоматический статический импорт в NetBeans тоже есть.

Demo 3

Генерация элементов класса

16) Создание нового класса из объявления new Person(...) в NetBeans сделано иначе, в IDEA. По Alt+Enter разрешения противоречий в NetBeans предлагается два варианта: создать независимый класс в пакете, либо объявить в текущем классе в качестве внутреннего приватного статического класса. В IDEA появляется отдельный диалог с кнопками OK/Cancel для выбора целевого пакета и целевого каталога, а в NetBeans все пункты для выбора нужного способа находятся во всплывающей подстрочной подсказке. Здесь NetBeans удобнее. Зато IDEA догадалась обозвать параметры конструктора нового класса более подходящими именами (String name, int age), в то время как NetBeans тупо взяла за основу содержимое параметра и обезличила второй: public Person(String nik, int i).

17) Создание одноимённых полей по сигнатуре конструктора нового класса в NetBeans затруднена, необходимо поработать с редактором кода в теле конструктора, чтобы были определены сущности для полей: this.name = name; this.age = age;. Поля могут быть финальными по разрешению противоречий Alt+Enter.

18) Генерация get/set для полей реализована при этом модификатор final для поля, инициализированного в конструкторе, учитывается, и не генерируется противоречивый код с присваиванием значений финальному полю.

19) Генерация методов equals() и hashCode(). В NetBeans реализуется через вызов пункта контектного меню «Втавка кода...» Создать equals() и hashCode(). Открывается диалог с двумя одинаковыми списками полей, значения которых нужно выбрать для использования в этих двух методах, всё наглядно и просто. А в IDEA для этого используется мастер. Код получается похожим, обе среды предлагают сделать его короче, автоматически оптимизируя условные выражения, что, кстати, вызвало смех в зале. :) Результирующий код NetBeans после автоматических генерации и оптимизаций:

@Override
    public int hashCode() {
        int hash = 3;
        hash = Objects.hashCode(this.name) + hash * 37;
        hash = hash * 37 + this.age;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Person other = (Person) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        return this.age == other.age;
    }
В IDEA он короче за счёт отсутствия фигурных скобок в однострочных выражениях.

Demo 4

Навигация по проекту.

20) NetBeans тоже может искать в дереве файлов файл с вводимым именем, но к заданной строке в нём не переходит.

21) Случаи использования. В NetBeans эта команда доступна в контектном меню элемента из дерева окна Проектов и в элементах дерева Навигатора классов. При вызове открывается диалоговое окно для задания параметров поиска (в комментариях, в преопределённых, перегруженных методах; внутри текущего проекта, среди открытых проектов, задать собственный контекст поиска и т.д.). Результаты поиска отображаются в отдельном окне-вкладке области вывода, новый поиск открывает новое окно с результатами — можно сравнивать и анализировать несколько поисковых запросов одновременно. В окне результата поиска возможна группировка по критериям, но она беднее (только логический и физический виды), чем в IDEA.

Demo 6

Улучшение существующего кода

22) <Сравнение сред слишком сложное>

Demo 7

Печатная машинка vs. мышь

23) Идея изучения шорткатов простив мышевозни. Однако ведущий не принижает роль мыши в IDE: нужда в ней возникает при навигации по ссылкам и меню, при просмотре кода, работе с IDE как с CAD (средой проектирования).

Demo 8

Общие принципы эффективной работы

24) Статистика использования Code Completion за последнее время. Интересная и прикольная фича в IDEA. Для самоанализа и самокопания. ;)

25) Автосохранение файлов. Знакомо. В NetBeans есть внутренняя история изменений каждого файла. Можно историю завязать на систему контроля версий Mercurial, Git, SVN через плагины. Просмотр diff между текущим файлом и какой-то версией в истории изменений тоже работает в среде абсолютно прозрачно (во вкладках окна редактирования). В IDEA такая особенность есть?

26) Автоформатирование при сохранении. Использую в NetBeans: автоматически убираются неиспользуемые объявления импорта, реорганизацию импорта. Для всех языков можно настроить общие действия автоформата при сохранении (убрать концевые пробелы, например, и переформатировать строки).

Спасибо за внимание. Освежил свои знания по средам и их возможностям работы с кодом.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.