Страницы

Поиск по вопросам

Показаны сообщения с ярлыком glassfish. Показать все сообщения
Показаны сообщения с ярлыком glassfish. Показать все сообщения

воскресенье, 12 января 2020 г.

Glassfish стартует но не показывает ничего ни на 8080, ни на 4848 портах

#java #centos #glassfish


В чем может быть проблема?

CentOS 64 битная.

asadmin домены поднимает
enable-secure-admin делал

[root@javavps ~]# sudo lsof -Pn -iTCP -sTCP:LISTEN | grep '8080\|4848'
java     1400   root  349u  IPv6 3818283652      0t0  TCP *:8080 (LISTEN)
java     1400   root  358u  IPv6 3818284369      0t0  TCP *:4848 (LISTEN)


Вот еще что выдал 

COMMAND   PID   USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
sendmail  377   root    4u  IPv4 3813528452      0t0  TCP 127.0.0.1:25 (LISTEN)
sshd      840   root    3u  IPv4 3816127270      0t0  TCP *:22 (LISTEN)
sshd      840   root    4u  IPv6 3816127277      0t0  TCP *:22 (LISTEN)
httpd    1030   root    3w  IPv4 3816157910      0t0  TCP *:80 (LISTEN)
httpd    1031 apache    3u  IPv4 3816157910      0t0  TCP *:80 (LISTEN)
java     1400   root  349u  IPv6 3818283652      0t0  TCP *:8080 (LISTEN)
java     1400   root  354u  IPv6 3818284000      0t0  TCP *:8181 (LISTEN)
java     1400   root  358u  IPv6 3818284369      0t0  TCP *:4848 (LISTEN)
java     1400   root  363u  IPv6 3818285427      0t0  TCP *:3700 (LISTEN)
java     1400   root  370u  IPv6 3818291333      0t0  TCP *:8686 (LISTEN)
java     1400   root  371u  IPv6 3818289128      0t0  TCP *:7676 (LISTEN)

    


Ответы

Ответ 1



Значит так... Проблема была в том, что необходимо было открыть порты в iptables # iptables -I INPUT -p tcp --dport 4848 -m state --state NEW -j ACCEPT # iptables -I INPUT -p tcp --dport 8080 -m state --state NEW -j ACCEPT Разрешили порты # service iptables save Сохранили # service iptables restart Перезапустили. Теперь по адресу сервера, по порту 4848 открывается админка.

суббота, 11 января 2020 г.

Glassfish NullPointeException сервер не запускается

#java #intellij_idea #java_ee #glassfish


Только скачал архив GlassFish 5.0 - Full Platform, разархивировал его, запускаю через
командную строку 


  asadmin start-domain


и выбивает

`Exception in thread "main" java.lang.NullPointerException
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.initializeServiceLocator(AbstractModulesRegistryImpl.java:152)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.newServiceLocator(AbstractModulesRegistryImpl.java:144)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:218)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:224)
    at com.sun.enterprise.module.single.StaticModulesRegistry.createServiceLocator(StaticModulesRegistry.java:88)
    at com.sun.enterprise.admin.cli.CLIContainer.getServiceLocator(CLIContainer.java:217)
    at com.sun.enterprise.admin.cli.CLIContainer.getLocalCommand(CLIContainer.java:255)
    at com.sun.enterprise.admin.cli.CLICommand.getCommand(CLICommand.java:231)
    at com.sun.enterprise.admin.cli.AdminMain.executeCommand(AdminMain.java:371)
    at com.sun.enterprise.admin.cli.AdminMain.doMain(AdminMain.java:306)
    at org.glassfish.admin.cli.AsadminMain.main(AsadminMain.java:57)`


Пробовал в файле asenv.bat установить путь set path=C:/.../Java/bin - не помогло.
Пробовал так запустить: asadmin start-domain domain1 - не помогло.

Установлена: jdk-9.0.1
Также пробовал на 8-ой, не помогло. Что делать???
    


Ответы

Ответ 1



Решение оказалось банальным до ужаса, облазив просторы интернета я обнаружил, что jdk-9.0.1 тупо не поддерживается (пока что) GlassFish 5.0 - Full Platform. Я установил обратно 8-мую Java и начал тестить. Ошибка оставалась. Пути в системных переменных я поменял с 9 на 8. Но ошибка не уходила. И тут я решил проверить, а какая версия Java вызывается с коммандной строки. Как оказалось, даже если в переменной Path установлен путь к 8, оно по какой-то причине все равно вызывает 9-ю Java. Перезагрузка не помогла. Решение - полное удаление 9 джавы. P.S. иногда выскакивала ошибка: your jdk is version 0 Это опять таки из-за несовместимости.

суббота, 7 декабря 2019 г.

Отличие Tomcat и GlassFish

#glassfish #tomcat


Здравствуйте.

Ответьте, пожалуйста, в чем состоит отличие серверов GlassFish и Apache Tomcat. Может,
какой-то из этих серверов лучше, может какой-то быстрее?
    


Ответы

Ответ 1



Можно и по-русски. Хотя, что бы там ни говорили, программист просто обязан дружить с инглишем, иначе, рано или поздно, он застрянет в своём развитии. Вот, пожалуй, САМЫЕ главные отличия Tomcat и Glassfish: Glassfish имеет EJB-контейнер, а Tomcat - нет; Glassfish имеет развитую admin-консоль, Tomcat - совсем простую; Glassfish полностью реализует спецификацию JavaEE, Tomcat - нет; Glassfish имеет поддержку кластеризации, а на Tomcat её надо имитировать разными средствами.

Ответ 2



Вот эта статья думаю вам поможет, правда, она старенькая, но основные принципы разъясняет.

воскресенье, 1 декабря 2019 г.

Как работает web приложение java?

#java #spring #java_ee #servlet #glassfish


Кто-нибудь может объяснить как работает java web приложение с аннотациями и spring-mvc
совместно с сервером приложений? (В моем случае это Glassfish 4)

Когда мы работаем с консольным приложением java, мы указываем команде java имя скомилированного
класса. Я так понимаю, JRE ищет в указанном классе метод public static void main(String
args[]) и выполняет его. И этот метод main считается точкой входа в программу.


А когда у нас web приложение, у нас имеется какая-то точка входа? Я по началу думал,
что точка входа это web.xml. Но если мы используем spring-mvc и конфигурируем его с
помощью аннотаций, то я так понял web.xml вообще может быть пустым.
Когда глассфишу скармливается war'ник, то я так понимаю в памяти создаются экземпляры
классов которые помечены аннотациями @Service и @Controller, но кто их создает? Я читал,
что это делает спринг, в рамках его IoC, DI и его контейнерной роли, но спринг тоже
кто-то должен запустить? 
По логике, инициализация спринга должна происходить при явном или неявном вызове
его конструкторов в точке входа, но где тогда она? Или его инициализацию производит
сервер приложений? Но каким образом мы указываем ему это сделать?

Вот мой SpringInitializer, я так понимаю основная магия происходит здесь?
Этот код выполняет Glassfish? Как он понимает, что именно этот класс надо выполнить?


import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpringInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { SpringConfiguration.class };
    }

    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    } 
}


Я рылся в руководстве Шилдта по Java, а также в Spring in Action, и пару недель пробую
различные запросы по сабжу в гугл. Или в этих книгах не было явных ответов на эти вопросы,
или я их пропустил, или не понял.

Буду признателен за объяснение, или если кто тыкнет носом где читать.
    


Ответы

Ответ 1



Я рылся в руководстве Шилдта по Java, а также в Spring in Action Если вы хотите разобраться с базовыми механизмами работы веб-приложений начинать стоит со спецификации Servlet API (3.0, 3.1). А когда у нас web приложение, у нас имеется какая-то точка входа? Как таковой точки входа нет. Есть контейнер сервлетов, который берет ваш WAR и, если все хорошо, стартует жизненный цикл вашего веб-приложения: устанавливает параметры, оповещает слушателей, пробрасывает запросы в сервлеты, пропускает их через фильтры. По сути, контейнер сервлетов занимается тем, что оперирует объектами, которые можно описать в web.xml, а, начиная с 3й версии спецификации, он должен уметь искать их и без web.xml. ... но кто их создает? Я читал, что это делает спринг, в рамках его IoC, DI и его контейнерной роли, но спринг тоже кто-то должен запустить? Все верно, IoC-контейнер спринга (а именно AnnotationConfigWebApplicationContext в вашем случае) сканирует видимый ему CLASSPATH и создает ваши бины, ориентируясь на аннотации. Осталось понять, кто создает экземпляр этого ApplicationContext и запускает его жизненный цикл (см. ниже). По логике, инициализация спринга должна происходить при явном или неявном вызове его конструкторов в точке входа, но где тогда она? Или его инициализацию производит сервер приложений? Но каким образом мы указываем ему это сделать? Вы очень верно рассуждаете. Начиная со спецификации Servlet API 3.0 появилась возможность не использовать web.xml. Но контейнер сервлетов должен как-то узнать, где находится код, инициализирующий веб-приложение. Тут помогает механизм, известный как Service Provider. Если коротко, он ищет в CLASSPATH для контейнера сервлетов файл-дескриптор META-INF/services/javax.servlet.ServletContainerInitializer, который указывает на реализацию интерфейса ServletContainerInitializer. В случае Spring-а это будет класс SpringServletContainerInitializer. Давайте без стеснения посмотрим на его исходники. На объявлении класса висит аннотация @HandlesTypes: @HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer {} По контракту интерфейса ServletContainerInitializer контейнер обязуется передать конкретной реализации в её единственный метод onStartup коллекцию классов, попадающих в перечисленные в аннотации @HandlesTypes. Здесь у нас указан только интерфейс WebApplicationInitializer, поэтому Glassfish передаст все найденные реализации WebApplicationInitializer. Для каждой реализации будет создан экземпляр и вызван метод onStartup: for (WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); } И именно ваш SpringInitializer является такой реализацией. Кроме того SpringInitializer наследует AbstractDispatcherServletInitializer. И вот именно этот AbstractDispatcherServletInitializer и "запускает Spring", создавая WebApplicationContext. Все сошлось. PS. Читайте спецификации и ознакомьтесь с JavaDoc упомянутых в моем ответе классов. В Spring вообще любят подробно описывать все "магические" механизмы в документации ключевых абстрактных классов и интерфейсов.

Ответ 2



Точка входа в виде метода main есть в любом Java приложении. Просто в случае web приложений исполняемой Java программой является контейнер сервлетов / сервер приложений (вот, например, main-метод Tomcat). WEB приложение разворачивается (deploy) внутри контейнера сервлетов. Например, подумайте, если вам требуется задать приложению какие-то аргументы JVM, кому вы их будете передавать? Серверу приложений. Потому что именно он и есть исполняемое приложение, а написанная вами логика существует внутри него и подчиняется спецификации JEE. До версии JEE 6, когда было введено Servlet 3.0 API, эта спецификация требовала помещать конфигурацию вашего приложения в deployment descriptor - web.xml. Начиная с Servlet 3.0 API, этот файл не является обязательным, вместо него приложение может использовать интерфейс ServletContainerInitializer. Когда вы разворачиваете web-приложение, контейнер сервлетов сканирует classpath этого приложения на предмет наличия имплементации указанного интерфейса, а когда находит, то выполняет метод onStartup(), в котором должна выполняться инициализация приложения. Поскольку Spring Web построен на сервлетах, все написанное выше относится к нему самым прямым образом. Конфиг на аннотациях в Spring доступен с версии Servlet 3.0+ API. Реализация интерфейса ServletContainerInitializer находится в модуле spring-web, вы его получаете сразу как подключаете соответствующую зависимость в maven или gradle. Взгляните что делает этот код. Выдержка из документации: Interface which allows a library/runtime to be notified of a web application's startup phase and perform any required programmatic registration of servlets, filters, and listeners in response to it. Implementations of this interface may be annotated with HandlesTypes, in order to receive (at their onStartup(java.util.Set>, javax.servlet.ServletContext) method) the Set of application classes that implement, extend, or have been annotated with the class types specified by the annotation Он получает все классы, которые помечены аннотацией WebApplicationInitializer и инициализирует их. AbstractAnnotationConfigDispatcherServletInitializer, если вы посмотрите его иерархию, как раз является таким классом. Дальше, извините, я просто процитирую ответ в параллеьного сайта, где то же самое расписано пошагово: Servlet context listener (web.xml) approach A web application WAR is being deployed by user. Servlet container (Tomcat) reads web.xml. Servlet context listener ContextLoaderListener is being instantiated (if defined as inside the web.xml) by servlet container. ContextLoaderListener creates new WebApplicationContext with application context XML configuration. Your ROOT context beans are registered and instantiated by BeanFactory inside the application context. DispatcherServlet is being instantiated by servlet container. DispatcherServlet creates its own WebApplicationContext (WEB-INF/{servletName}-servlet.xml by default) with the ROOT context as its parent. Your servlet beans are registered and instantiated by BeanFactory inside the application context. DispatcherServlet registers some default beans in case you did not provide them yourself. Servlet container initializer (non web.xml) approach This one is possible with Servlet 3 features. A web application WAR is being deployed by user. Servlet container searches for classes implementing ServletContainerInitializer via Java's ServiceLoader. Spring's SpringServletContainerInitializer is found and instantiated by servlet container. Spring's initializer reads web application's class-path and searches for WebApplicationInitializer implementations. Your WebApplicationInitializer is found (btw. check its JavaDoc!!!) and instantiated by SpringServletContainerInitializer. Your WebApplicationInitializer creates new ROOT WebApplicationContext with XML or @Configuration based configuration. Your WebApplicationInitializer creates new servlet WebApplicationContext with XML or @Configuration based configuration. Your WebApplicationInitializer creates and registers new DispatcherServlet with the context from previous step. Servlet container finishes the web application initialization and instantiates components which were registered by their class in previous steps (none in my example). Т.о. чтобы запустить приложение на Spring при помощи аннотаций, нужно имплементировать интерфейс WebApplicationInitializer - можно как напрямую, так и унаследоваться от одного из абстрактных классов, которые есть в поставке, и передать туда конфигурационный файл (в вашем примере SpringConfiguration). Дальше Spring получает из него аннтотации @EnableWebMvc, @ComponentScan (это самые основные) и вытягивает остальную конфигурацию. Все вместе это образует ApplicationContext (несмотря на то что написано в единственном числе, их может быть несколько) - описание среды окружения приложения, который как раз и предоставляет возможность обращаться в бинам, переменным и прочим ресурсам приложения с помощью аннотаций.

Ответ 3



Точкой входа и есть сам web.xml к которому обращается контейнер сервлетов при деплое, которым в вашем случае является гласфиш. Когда вы деплоите варку или запускаете проект в своей среде разработки, глазфиш поднимает, все сервлеты и конфигурации из web.xml. 1) web.xml в спринге не остается пустым, просто его работу с сервлетами берет на себя диспетчер сервлетов спринга, но в web.xml мы все равно указываем конфигурации диспетчера. 2)Этот вопрос я несколько раз перечитал и не могу понять его суть. Какой варник и причем здесь аннотации контроллеров и сервисов? Спринг никто запускать не должен, это просто упрощенная версия контейнера бинов, в которой используются аннотации для быстрой и понятной разработки. В памяти создается один бин, который с помощью аннотаций Autowired или Inject можно инжектить не создавая новых экземпляров этого класса, а в случае нескольких реализаций бина, можно выбрать какую именно вы хотите использовать добавив аннотацию Qualifier(name=""). 3)В вашем примере приведен, как я понял, конфигурационный файл, который так же должен быть прописан в вашем web.xml. Если вы используете xml конфигурации, тогда они явно указываются в веб.хмл в приблизительно таком виде: appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/servlet-context.xml 1 Если вы используете классы, тогда как глазфиш понимает, что ему надо дергать это уже зашито в аннотациях самими разработчиками спринга и почему оно так работает, дать ответ я не могу.

среда, 10 октября 2018 г.

Отличие Tomcat и GlassFish

Здравствуйте. Ответьте, пожалуйста, в чем состоит отличие серверов GlassFish и Apache Tomcat. Может, какой-то из этих серверов лучше, может какой-то быстрее?


Ответ

Можно и по-русски. Хотя, что бы там ни говорили, программист просто обязан дружить с инглишем, иначе, рано или поздно, он застрянет в своём развитии. Вот, пожалуй, САМЫЕ главные отличия Tomcat и Glassfish: Glassfish имеет EJB-контейнер, а Tomcat - нет; Glassfish имеет развитую admin-консоль, Tomcat - совсем простую; Glassfish полностью реализует спецификацию JavaEE, Tomcat - нет; Glassfish имеет поддержку кластеризации, а на Tomcat её надо имитировать разными средствами.

понедельник, 8 октября 2018 г.

Как работает web приложение java?

Кто-нибудь может объяснить как работает java web приложение с аннотациями и spring-mvc совместно с сервером приложений? (В моем случае это Glassfish 4)
Когда мы работаем с консольным приложением java, мы указываем команде java имя скомилированного класса. Я так понимаю, JRE ищет в указанном классе метод public static void main(String args[]) и выполняет его. И этот метод main считается точкой входа в программу.
А когда у нас web приложение, у нас имеется какая-то точка входа? Я по началу думал, что точка входа это web.xml. Но если мы используем spring-mvc и конфигурируем его с помощью аннотаций, то я так понял web.xml вообще может быть пустым. Когда глассфишу скармливается war'ник, то я так понимаю в памяти создаются экземпляры классов которые помечены аннотациями @Service и @Controller, но кто их создает? Я читал, что это делает спринг, в рамках его IoC, DI и его контейнерной роли, но спринг тоже кто-то должен запустить? По логике, инициализация спринга должна происходить при явном или неявном вызове его конструкторов в точке входа, но где тогда она? Или его инициализацию производит сервер приложений? Но каким образом мы указываем ему это сделать?
Вот мой SpringInitializer, я так понимаю основная магия происходит здесь? Этот код выполняет Glassfish? Как он понимает, что именно этот класс надо выполнить?
import javax.servlet.MultipartConfigElement; import javax.servlet.ServletRegistration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpringInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override protected Class[] getRootConfigClasses() { return new Class[] { SpringConfiguration.class }; }
@Override protected Class[] getServletConfigClasses() { return null; }
@Override protected String[] getServletMappings() { return new String[] { "/" }; } }
Я рылся в руководстве Шилдта по Java, а также в Spring in Action, и пару недель пробую различные запросы по сабжу в гугл. Или в этих книгах не было явных ответов на эти вопросы, или я их пропустил, или не понял.
Буду признателен за объяснение, или если кто тыкнет носом где читать.


Ответ

Я рылся в руководстве Шилдта по Java, а также в Spring in Action
Если вы хотите разобраться с базовыми механизмами работы веб-приложений начинать стоит со спецификации Servlet API (3.0, 3.1).
А когда у нас web приложение, у нас имеется какая-то точка входа?
Как таковой точки входа нет. Есть контейнер сервлетов, который берет ваш WAR и, если все хорошо, стартует жизненный цикл вашего веб-приложения: устанавливает параметры, оповещает слушателей, пробрасывает запросы в сервлеты, пропускает их через фильтры. По сути, контейнер сервлетов занимается тем, что оперирует объектами, которые можно описать в web.xml, а, начиная с 3й версии спецификации, он должен уметь искать их и без web.xml.
... но кто их создает? Я читал, что это делает спринг, в рамках его IoC, DI и его контейнерной роли, но спринг тоже кто-то должен запустить?
Все верно, IoC-контейнер спринга (а именно AnnotationConfigWebApplicationContext в вашем случае) сканирует видимый ему CLASSPATH и создает ваши бины, ориентируясь на аннотации. Осталось понять, кто создает экземпляр этого ApplicationContext и запускает его жизненный цикл (см. ниже).
По логике, инициализация спринга должна происходить при явном или неявном вызове его конструкторов в точке входа, но где тогда она? Или его инициализацию производит сервер приложений? Но каким образом мы указываем ему это сделать?
Вы очень верно рассуждаете. Начиная со спецификации Servlet API 3.0 появилась возможность не использовать web.xml. Но контейнер сервлетов должен как-то узнать, где находится код, инициализирующий веб-приложение. Тут помогает механизм, известный как Service Provider. Если коротко, он ищет в CLASSPATH для контейнера сервлетов файл-дескриптор META-INF/services/javax.servlet.ServletContainerInitializer, который указывает на реализацию интерфейса ServletContainerInitializer. В случае Spring-а это будет класс SpringServletContainerInitializer.
Давайте без стеснения посмотрим на его исходники. На объявлении класса висит аннотация @HandlesTypes
@HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer {}
По контракту интерфейса ServletContainerInitializer контейнер обязуется передать конкретной реализации в её единственный метод onStartup коллекцию классов, попадающих в перечисленные в аннотации @HandlesTypes. Здесь у нас указан только интерфейс WebApplicationInitializer, поэтому Glassfish передаст все найденные реализации WebApplicationInitializer. Для каждой реализации будет создан экземпляр и вызван метод onStartup
for (WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); }
И именно ваш SpringInitializer является такой реализацией. Кроме того SpringInitializer наследует AbstractDispatcherServletInitializer. И вот именно этот AbstractDispatcherServletInitializer и "запускает Spring", создавая WebApplicationContext. Все сошлось.

PS. Читайте спецификации и ознакомьтесь с JavaDoc упомянутых в моем ответе классов. В Spring вообще любят подробно описывать все "магические" механизмы в документации ключевых абстрактных классов и интерфейсов.