Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Клиент работает только из-под NetBeans


Автор: KazOFF 19.8.2010, 10:15
Имеются Glassfish 3.0.1 и NetBeans 6.9.
Я сделал простой примерчик HelloWorld, и отдельный клиент на на JavaSE.
Код

import hw.sBeanRemote;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) throws NamingException {
 
  Properties props = new Properties();

  props.setProperty("java.naming.factory.initial",
                    "com.sun.enterprise.naming.SerialInitContextFactory");

  props.setProperty("java.naming.factory.url.pkgs",
                    "com.sun.enterprise.naming");

  props.setProperty("java.naming.factory.state",
                    "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

  props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");

  props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

  InitialContext ic = new InitialContext(props);
  sBeanRemote hw = (sBeanRemote) ic.lookup("ejb/sBean");
  JOptionPane.showMessageDialog(null, hw.say());
    }

}

Если запускать клиент в NetBeans то всё хорошо работает, но если запустить отдельно JAR файл то выдается следующая ошибка
Код

Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:197)
    at eeclient.Main.main(Main.java:44)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)

В список библиотек добавлены gf-client.jar и собственно JAR с EJB. Так же наткнулся на данную проблему, которая решалась полным импортом библиотк из glassfish/module, но это не помогло. Как можно решить данную проблему?

Автор: Skipy 19.8.2010, 10:38
Решается только одним способом - правильным формированием classpath. В NB нужные классы есть, вне него - нет.

Автор: KazOFF 19.8.2010, 13:49
Класс com.sun.enterprise.naming.SerialInitContextFactory находится в файле glassfish-naming.jar, но даже его добавление не помогает. Выводит ошибку
Код

Exception in thread "main" java.lang.NoClassDefFoundError: org/glassfish/internal/api/Globals
at com.sun.enterprise.naming.impl.SerialInitContextFactory.<init>(SerialInitContextFactory.java:74)
    at com.sun.enterprise.naming.SerialInitContextFactory.<init>(SerialInitContextFactory.java:58)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:197)
    at eeclient.Main.main(Main.java:44)
Caused by: java.lang.ClassNotFoundException: org.glassfish.internal.api.Globals
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 13 more

Я даже не знаю где искать эти классы, которые требуются для выполнения. По FAQ который на сайте глассфиша нужен только gf-client. Но на деле оказалось иначе.

Автор: Kircul 19.8.2010, 14:13
Может попробовать appserv-rt.jar? http://www.jarfinder.com/index.php/java/info/com.sun.enterprise.naming.SerialInitContextFactory, http://forums.sun.com/thread.jspa?threadID=426416.

Автор: KazOFF 19.8.2010, 14:26
Пробовал добавлять даже все jar файлы которые есть в glassfish.
appserv-rt нужен для glassfish v2 (https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB)

Автор: pointer82 13.9.2010, 11:49
была та же ошибка, излечилось именно так, как сказано на сайте Glassfish https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB
"Include $GLASSFISH_HOME/modules/gf-client.jar in the client's classpath".
Т.е. должна быть указана в classpath ссылка именно на gf-client.jar, лежащий в папке гласфиша. Если копируем куда-то gf-client.jar и указываем его, не работает.
У меня сейчас сервер и standalone-приложение на одной машине, и я просто указал путь к gf-client.jar, но как быть если клиентское приложение на другой машине, нежели сервер? Есть другой способ корректной работы удаленно с JNDI сервера Glassfish?

Автор: Skipy 13.9.2010, 12:33
Цитата(pointer82 @ 13.9.2010,  11:49)
Если копируем куда-то gf-client.jar и указываем его, не работает.

Это означает, что скопировали не все библиотеки, которые требуются gf-client.jar. В его манифесте указано, что ему нужно:

Код

Class-Path: ../modules/woodstox-osgi.jar ../modules/tools.jar ../modul
 es/glassfish-corba-asm.jar ../modules/glassfish-corba-codegen.jar ../
 modules/glassfish-corba-csiv2-idl.jar ../modules/glassfish-corba-newt
 imer.jar ../modules/glassfish-corba-omgapi.jar ../modules/glassfish-c
 orba-orb.jar ../modules/glassfish-corba-orbgeneric.jar ../modules/aut
 o-depends.jar ../modules/config.jar ../modules/config-types.jar ../mo
 dules/hk2.jar ../modules/hk2-core.jar ../modules/osgi-adapter.jar ../
 modules/tiger-types-osgi.jar ../modules/grizzly-comet.jar ../modules/
 grizzly-config.jar ../modules/grizzly-framework.jar ../modules/grizzl
 y-http.jar ../modules/grizzly-http-servlet.jar ../modules/grizzly-por
 tunif.jar ../modules/grizzly-rcm.jar ../modules/grizzly-utils.jar ../
 modules/pkg-client.jar ../modules/jaxb-osgi.jar ../modules/webservice
 s-osgi.jar ../modules/activation.jar ../modules/el-api.jar ../modules
 /mail.jar ../modules/endorsed/webservices-api-osgi.jar ../modules/end
 orsed/jaxb-api-osgi.jar ../modules/junit.jar ../modules/javax.persist
 ence.jar ../modules/org.eclipse.persistence.antlr.jar ../modules/org.
 eclipse.persistence.asm.jar ../modules/org.eclipse.persistence.core.j
 ar ../modules/org.eclipse.persistence.jpa.jar ../modules/org.eclipse.
 persistence.jpa.modelgen.jar ../modules/org.eclipse.persistence.oracl
 e.jar ../modules/bean-validator.jar ../modules/endorsed/javax.annotat
 ion.jar ../modules/javax.ejb.jar ../modules/javax.enterprise.deploy.j
 ar ../modules/javax.jms.jar ../modules/javax.management.j2ee.jar ../m
 odules/javax.resource.jar ../modules/javax.security.auth.message.jar 
 ../modules/javax.security.jacc.jar ../modules/javax.servlet.jar ../mo
 dules/javax.servlet.jsp.jar ../modules/javax.transaction.jar ../modul
 es/admin-core.jar ../modules/admin-util.jar ../modules/cli-framework.
 jar ../modules/config-api.jar ../modules/monitoring-core.jar ../modul
 es/acc-config.jar ../modules/gf-client-module.jar ../modules/amx-core
 .jar ../modules/amx-j2ee.jar ../modules/annotation-framework.jar ../m
 odules/common-util.jar ../modules/container-common.jar ../modules/gla
 ssfish-api.jar ../modules/glassfish-ee-api.jar ../modules/glassfish-n
 aming.jar ../modules/internal-api.jar ../modules/stats77.jar ../modul
 es/connectors-inbound-runtime.jar ../modules/connectors-internal-api.
 jar ../modules/connectors-runtime.jar ../modules/work-management.jar 
 ../modules/glassfish.jar ../modules/kernel.jar ../modules/deployment-
 common.jar ../modules/deployment-javaee-core.jar ../modules/dol.jar .
 ./modules/dtds.zip ../modules/schemas.zip ../modules/ejb-container.ja
 r ../modules/ejb-internal-api.jar ../modules/asm-all-repackaged.jar .
 ./modules/ldapbp-repackaged.jar ../modules/management-api.jar ../modu
 les/flashlight-agent.jar ../modules/flashlight-framework.jar ../modul
 es/gmbal.jar ../modules/jms-core.jar ../modules/orb-connector.jar ../
 modules/orb-iiop.jar ../modules/eclipselink-wrapper.pom ../modules/jp
 a-connector.jar ../modules/persistence-common.jar ../modules/cmp-inte
 rnal-api.jar ../modules/appclient.security.jar ../modules/ejb.securit
 y.jar ../modules/security.jar ../modules/websecurity.jar ../modules/w
 ebservices.security.jar ../modules/jta.jar ../modules/jts.jar ../modu
 les/transaction-internal-api.jar ../modules/el-impl.jar ../modules/js
 p-impl.jar ../modules/war-util.jar ../modules/web-cli.jar ../modules/
 web-core.jar ../modules/web-glue.jar ../modules/web-gui-plugin-common
 .jar ../modules/web-naming.jar ../modules/jsr109-impl.jar ../modules/
 mimepull.jar ../../mq/lib/imq.jar ../../mq/lib/imqadmin.jar ../../mq/
 lib/imqutil.jar ../../mq/lib/fscontext.jar ../lib/install/application
 s/jmsra/imqjmsra.jar ../lib/install/applications/__ds_jdbc_ra/__ds_jd
 bc_ra.jar ../lib/install/applications/__cp_jdbc_ra/__cp_jdbc_ra.jar .
 ./lib/install/applications/__xa_jdbc_ra/__xa_jdbc_ra.jar ../lib/insta
 ll/applications/__dm_jdbc_ra/__dm_jdbc_ra.jar ../../javadb/lib/derby.
 jar ../../javadb/lib/derbyclient.jar ../../javadb/lib/derbynet.jar ..
 /../javadb/lib/derbytools.jar ../../javadb/lib/derbyrun.jar ../lib/in
 stall/applications/jaxr-ra/jaxr-ra.jar


P.S. Вы все еще хотите его использовать?

Автор: pointer82 13.9.2010, 14:43
поэтому я и задал вопрос, можно ли как-то иначе использовать JNDI в Glassfish удаленно?

Автор: eros2 13.9.2010, 22:51
На клиенте должны быть все необходимые клиентские либы. И именно той версии, что и на сервере.
В JBoss точно так же.

Естественно, только для вызова EJB все либы не нужны. Достаточно просто вычислить нужные, если добавить все, проверить что программа работает, а потом убирать по одной и проверять работоспособность. Таким образом убрать ненужные. ))

Автор: Skipy 14.9.2010, 09:21
Цитата(eros2 @ 13.9.2010,  22:51)
если добавить все, проверить что программа работает, а потом убирать по одной и проверять работоспособность. Таким образом убрать ненужные. ))

Их там почти 200. Вы после каждой убранной библиотеки будете проводить полнообъемное тестирование? А иначе никак - библиотека может быть задействована в каком-то хитрозаковыристом случае.

Автор: eros2 14.9.2010, 10:02
Цитата(Skipy @ 14.9.2010,  09:21)
Цитата(eros2 @ 13.9.2010,  22:51)
если добавить все, проверить что программа работает, а потом убирать по одной и проверять работоспособность. Таким образом убрать ненужные. ))

Их там почти 200. Вы после каждой убранной библиотеки будете проводить полнообъемное тестирование? А иначе никак - библиотека может быть задействована в каком-то хитрозаковыристом случае.

В JBoss-е 5.1 их всего 93 ))
Реально нужно для работы при использовании EJB3, JMS, Hibernate - примерно 36.

Хитрозаковыристые случаи обычно вылезают в процессе разработки.

Автор: spruce 6.1.2011, 10:52
Цитата(KazOFF @ 19.8.2010,  10:15)
Имеются Glassfish 3.0.1 и NetBeans 6.9.
Я сделал простой примерчик HelloWorld, и отдельный клиент на на JavaSE.
Код

import hw.sBeanRemote;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) throws NamingException {
 
  Properties props = new Properties();

  props.setProperty("java.naming.factory.initial",
                    "com.sun.enterprise.naming.SerialInitContextFactory");

  props.setProperty("java.naming.factory.url.pkgs",
                    "com.sun.enterprise.naming");

  props.setProperty("java.naming.factory.state",
                    "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

  props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");

  props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

  InitialContext ic = new InitialContext(props);
  sBeanRemote hw = (sBeanRemote) ic.lookup("ejb/sBean");
  JOptionPane.showMessageDialog(null, hw.say());
    }

}

Если запускать клиент в NetBeans то всё хорошо работает, но если запустить отдельно JAR файл то выдается следующая ошибка
Код

Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:197)
    at eeclient.Main.main(Main.java:44)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)

В список библиотек добавлены gf-client.jar и собственно JAR с EJB. Так же наткнулся на данную проблему, которая решалась полным импортом библиотк из glassfish/module, но это не помогло. Как можно решить данную проблему?

Скажите, получалось ли у вас запустить приложение хотя бы из среды, только указав в свойстве адрес другого сервера, не localhost:
props.setProperty("org.omg.CORBA.ORBInitialHost", "another_host"); ?

Автор: necrom 23.2.2011, 18:07
У меня получилось )
На сервере мапишь глобальный JNDI
Код

@Stateless(mappedName="Session")


На клиенте прокатываешь следующее port  для nix 3700
Это удалённый метод AuthorizationSessionRemote который используется на сервере.
Код

private AuthorizationSessionRemote lookupAuthorizationSessionRemote(String ip, String port) {
        try {

            Properties p = new Properties();
            p.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
            p.setProperty("java.naming.factory.url.pkgs","com.sun.enterprise.naming");
            p.setProperty("java.naming.factory.state","com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

            p.put("org.omg.CORBA.ORBInitialHost",ip);
            p.put("org.omg.CORBA.ORBInitialPort",port);
            InitialContext ctx = new InitialContext(p);


            return (AuthorizationSessionRemote) ctx.lookup("Session");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }


Только вот, запустить удалённо клиент не вышло (

Автор: COVD 23.2.2011, 23:37
Просветите, о чем весь этот ужас, что такое "клиент"? Это два сервера, один обращается к другому и считается в данной ситуации клиентом? Или это, например, апплет? 

Автор: Temdegon 24.2.2011, 06:55
Цитата

Просветите, о чем весь этот ужас, что такое "клиент"? Это два сервера, один обращается к другому и считается в данной ситуации клиентом? Или это, например, апплет? 

Нее, это J2EE Application Client. Дектоп приложение, работающее с J2EE сервером. 
http://java.sun.com/developer/technicalArticles/J2EE/appclient/
Цитата

Скажите, получалось ли у вас запустить приложение хотя бы из среды, только указав в свойстве адрес другого сервера, не localhost

Посмотри в админке сервера, какие сетевые интерфейсы он слушает. Вроде по-дефолту он только на локалхост вешается, нужно дописать сетевой айпишник.
Я делал такую хрень по Netbeans-туториалам, и у меня точно все работало. И на локалхосте, и с другого компа, и через инет, и поверх VPN-Hamachi. Причем запускал и netbeans, и как стэндэлон, и прямо с сервера через Java WebStart.
Точно помню, что сразу нифига не работало, и я долго метался между GF3 и GF2. Вроде их примеры на GF3 не работали, а в GF2 какой-то затык был у меня с WebStart.

Автор: Ihavok 4.4.2011, 15:08
Цитата(KazOFF @ 19.8.2010,  13:49)
Класс com.sun.enterprise.naming.SerialInitContextFactory находится в файле glassfish-naming.jar, но даже его добавление не помогает. Выводит ошибку
Код

Exception in thread "main" java.lang.NoClassDefFoundError: org/glassfish/internal/api/Globals
at com.sun.enterprise.naming.impl.SerialInitContextFactory.<init>(SerialInitContextFactory.java:74)
    at com.sun.enterprise.naming.SerialInitContextFactory.<init>(SerialInitContextFactory.java:58)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:197)
    at eeclient.Main.main(Main.java:44)
Caused by: java.lang.ClassNotFoundException: org.glassfish.internal.api.Globals
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 13 more

Я даже не знаю где искать эти классы, которые требуются для выполнения. По FAQ который на сайте глассфиша нужен только gf-client. Но на деле оказалось иначе.

Так всё-таки... Какое решение то??? Я в classpath добавляю путь к gf-client.jar
А у меня ошибка при выполнении
Код

InitialContext ctx = new InitialContext(props);

Код

java.lang.NoClassDefFoundError: org/glassfish/internal/api/Globals

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)