今天兴起,想玩一玩Java EE 6.0,于是把Netbeans6.8给下载下来了。(好像是要快一些了。)
然后写了一个EJB3的模块(HelloWorld的无状态会话Bean),部署到它自带的Glassfishv3的服务器里。
但是问题出现了,我自己建了一个Java应用程序来,想通过JNDI的方式来访问这个EJB程序。
还是按照老规矩嘛:
public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws Exception { // TODO code application logic here 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"); //host props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); //EJB Port Context ctx = new InitialContext(props); HelloBeanRemote hr = (HelloBeanRemote) ctx.lookup(HelloBeanRemote.class.getName()); System.out.println(hr.getClass().getName()); System.out.println(hr.sayHello("zbs")); } }
然后就去找JNDI需要的SPI文件,按照以前的规矩是:Glassfish的lib目录下,包括javaee.jar,appserv-rt.jar,appserv-ext.jar和appserv-deploy-client.jar。但是,我发现除了javaee.jar,appserv-rt.jar以外,其它的没有了。奇怪!
同时,我很好奇的打开了appserv-rt.jar文件来看一下,发现里边什么都没有,就在META-INF下面有一个pom.xml和pom.properties,没有任何的class文件,我心里暗想:这还搞个屁啊!
但是,我还是把它引入到客户端项目里去了,然后运行以上的Main类,居然跑通了。我就奇怪了,没有任何的类文件,居然JNDI成功找到了资源。但是,如果我把appserv-rt.jar这个文件给单独copy出来(放在另外一个路径下),这就不能访问了,抛出了InitialFactory类没有找到。
难道这个Maven是个什么高级玩意,神奇了。(小弟没以前没玩过Maven,这不禁激起了我学习Maven的兴趣,改天发表一个Maven的学习感言个大家。)。打开pom.xml来看,也没看出什么奇特的。这就是传说中Java EE 6.0 对JDNI的改进吗?
真实奇特!