上面建立了一个名为jartest的Ant项目,默认的任务为default="jar",项目的路
径为build.xml文件所在目录
basedir="."。
应用编绎过后的class文件已经存在于应用的/build/classes/目录
下。
Ant定义了一个属性
“build.classes.dir”,他指向应用的/build/classes/目录。
定义了一个名叫jar的任
务,description是描述信息。
任务中使用jar
命令把/build/classes/目录下的所有class文件打包进jar文件,同时也把应用下
的META-INF目录下的所有文件打
包进jar文件的META-INF目录。
打包后的jar文件存放在应用目录下。
文件名
为:
ejbfile.jar
4.3.4如何进行WEB应用打包
一个Web应用发布到Jboss服务器时需要打成war包。
本节将介绍jar命令行及Ant任
务两种war文件的打包方
式。
1.在命令行下用jar命令进行war文件打包(土豆标注:
使用jar命令也可以打包成jar文件)
在打包前把文件存成以下结构:
WEB应用根目录
|--**/*.jsp
|--WEB-INF
|--web.xml
|--lib
|--*.*
|--classes
|--**/*.class
在Dos窗口中进入到WEB应用根目录下,执行如下命令
jarcvfEJBTest.war*
此命令把WEB应用根目录下的所有文件及文件夹打包成EJBTest.war文件
例如WEB应用根目录在:
D:
\java\webapp\,命令输入如下:
D:
\java\webapp>jarcvfEJBTest.war*
2.在Ant任务中进行war文件打包
如果文件存放的结构如下面所示:
WEB应用根目录
|--build.xml
|--**/*.jsp
|--WEB-INF
|--web.xml
|--lib
|--*.*
|--classes
|--**/*.class
那么Ant的war文件打包任务如下:
xmlversion="1.0"?
>
定义一个名叫war的任务。
任务中执行war打包操作,把应用下除了build.xml,/WEB-INF/web.xml之外的所有
文件夹及文件打进war包,同时把webxml="/WEB-INF/web.xml"作为web应用的
web.xml文件。
四:
创建java项目
【1】使用JBoss+EJB3.0
启动JBoss服务器,先配置如图
一旦发布成功,你就可以在jboss的管理平台查看她们的JNDI名,输入下面URL
http:
//localhost:
8080/jmx-console/点击service=JNDIView,查看EJB的JNDI名称。
在出现的页面中,找到“ListofMBeanoperations:
”栏。
点击”Invoke”按钮
找JNDIName界面
可以看见HelloWorld会话Bean的JNDI名,JNDI名的组成规则是“上层名称/
下层名称“,每层之间以”/”分隔。
HelloWorld会话Bean的JNDI名
是:
HelloWorldBean/remote。
HelloWorld会话Bean发布成功后,接下来介绍客户端如何访问她。
1、导包
为此工程添加ejb3.0jar包这些类包都可以在jboss安装目录的
client,/server/all/deploy/jboss-aop-jdk50.deployer,/server/all/deploy/ejb3.deployer,/lib/endorsed等文件夹下找到,
2、编写测试类Test:
packagecom.tudou.ejbtest;
importjava.util.Properties;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importcom.tudou.ejb.session.SayHello;
publicclassTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Propertiesp=newProperties();
p.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url","localhost");
try{
InitialContextctx=newInitialContext(p);
SayHellos=(SayHello)ctx.lookup("SayHelloBean/remote");
Stringsay=s.sayHello("tudou");
System.out.println(say);
}catch(NamingExceptione){
e.printStackTrace();
}
//上面赋值还可以写成
//p.setProperty("java.naming.factory.initial",
//"org.jnp.interfaces.NamingContextFactory");
//p.setProperty("java.naming.factory.url.pkgs",
//"org.jboss.naming:
org.jnp.interfaces");
//p.setProperty("java.naming.provider.url","localhost");
}
}
如果你没有在代码中配置而是在src文件夹下配置jndi.properties上面的main可以省略:
publicstaticvoidmain(String[]args){
try{
InitialContextctx=newInitialContext();
SayHellos=(SayHello)ctx.lookup("SayHelloBean/remote");
Stringsay=s.sayHello("tudou");
System.out.println(say);
}catch(NamingExceptione){
e.printStackTrace();
}
}
}
然后你必须在你项目的src目录下新建jndi.properties文件
如果你不知道里面的配置怎么写,你可以到JBoss安装目录下搜索jndi,可以找到在jboss\docs\examples\jca文件夹下有一个hajndi-jms-ds.xml的文件,在节点
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:
org.jnp.interfaces
java.naming.provider.url=${jboss.bind.address:
localhost}:
1100
…...
你就可以找到它们相应的键和值了。
注:
配置文件每行必须最前写,等号两边不能有空格。
【2】使用Weblogic+EJB3.0
只需修改JBoss几处代码即可:
第一,配置Weblogic,这个可能稍微有点复杂,因为和JBoss相比。
1、首先BEAHome为Weblogic的安装根目录,此处为:
2、配置用户名及密码。
即安装时的用户和密码。
密码为8位纯数字。
3、配置域,如:
base_domain或tudou_domain。
这个域就是安装时所写的那个。
密码纯8位数字密码。
修改EJB项目源码。
并用Weblogic发布。
一样导出为jar包。
一样需要导入EJBQWeblogicTest项目中。
(注:
此为土豆原创,沤心沥血测试得出!
测试通过!
请注意红色部分为修改部分)
packagecom.tudou.ejb.session;
importjavax.ejb.Remote;
@Remote(value=SayHello.class)//此处可以只写@Romote
publicinterfaceSayHello{
publicStringsayHello(Stringname);//没有方法体
}
packagecom.tudou.ejb.session;
importjavax.ejb.Stateless;
@Stateless(mappedName="SayHelloBean")//此处必须配置mappedName指定jndi
publicclassSayHelloBeanimplementsSayHello{
publicStringsayHello(Stringname){
return"你好,"+name;
}
}
packagecom.tudou.ejbtest;
importjava.util.Properties;
importjavax.naming.Context;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importcom.tudou.ejb.session.SayHello;
publicclassTest{
/**
*@tudou
*/
publicstaticvoidmain(String[]args){
Propertiesp=newProperties();
//p.setProperty("java.naming.factory.initial",
//"weblogic.jndi.WLInitialContextFactory");
//p.setProperty("java.naming.provider.url","t3:
//localhost:
7001");
//此处配置的参数键值和JBoss不同。
p.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
//t3好像是一种协议,它类似于http,snmp等(启动weblogic服务器时可以在控制台看到)。
但此处必须用t3,否则报错!
p.put(Context.PROVIDER_URL,"t3:
//localhost:
7001");
try{
InitialContextctx=newInitialContext(p);
SayHellos=(SayHello)ctx
.lookup("SayHelloBean#com.tudou.ejb.session.SayHello");
//注此处不像JBoss那样后面写的是/Remote或/Local。
Stringsay=s.sayHello("tudou");
System.out.println(say);
}catch(NamingExceptione){
e.printStackTrace();
}
}
}
下面援引自网络(红色部分为需要注意部分):
在这里作者要重点说明一下EJBJNDI名称默认的命名规则,命名规则如下:
1>如果EJB打包进后缀为*.ear的J2EE发布文件,默认的JNDI名称是
访问本地接口:
EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:
EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:
EJBHelloWorld打包进名为HelloWorld.ear的J2EE应用,访问她远程接口的
JNDI名是:
HelloWorld/HelloWorldBean/remote
2>如果EJB应用打包成后缀为*.jar的发布文件,默认的JNDI名称是
访问本地接口:
EJB-CLASS-NAME/local
访问远程接口:
EJB-CLASS-NAME/remote
例:
HelloWorld应用打包成HelloWorld.jar文件,访问她远程接口的JNDI名称
是:
HelloWorldBean/remote
另外有一点要注意:
EJB-CLASS-NAME是不带包名的,如
com.foshanshop.ejb3.impl.HelloWorldBean只需取
HelloWorldBean。
4.5EJB3.0远程调用
在正式的生产环境下,大部分调用EJB的客户端所在的服务器都为独立的Tomcat或
Resin。
下面介绍如何在
独立的Tomcat服务器中调用Jboss中的EJB。
在独立的Tomcat服务器中调用EJB需要
有以下步骤:
1>根据应用的需要,把调用EJB所依赖的Jar包拷贝到tomcat下的/shared/lib目录
或WEB应用的
WEB-INF/lib下,所依赖的Jar一般在jboss安装目录的client,/server/all/deploy
/jboss-aop-jdk50.deployer,
/server/all/deploy/ejb3.deployer,/lib/endorsed等文件夹下。
下面的jar文件是必需的:
[jboss安装目录]\client\jbossall-client.jar
[jboss安装目录]\client\jboss-remoting.jar
[jboss安装目录]\client\jboss-aop-jdk50-client.jar
[jboss安装目录]\client\jboss-aspect-jdk50-client.jar
[jboss安装目录]\client\jboss-ejb3-client.jar
[jboss安装目录]\client\jboss-ejb3x.jar
[jboss安装目录]\client\jboss-annotations-ejb3.jar
2>把调用的EJB接口拷贝到应用的/WEB-INF/classes/目录下,如果有包名,需要
把包和类一起拷过来。
注意,在部署web应用的服务器上,如果安装的是Tomcat服务器,它的安装路径不
能出现空格,如:
D:
\Tomcat5.0不能象D:
\Tomcat5.0这样带空格的安装目录,否
则会出现下面的异常:
java.rmi.UnmarshalException:
errorunmarshalling
arguments;nestedexceptionis:
.MalformedURLException:
noprotocol:
5.0/webapps/ROOT/WEB-INF
/classes/]。
现在把上述的HelloWorldEJB程序实现远程调用:
打包好的EJB组件
部署在一台机器的Jobss服务器上,把服务器启动起来,在部署web应用的机器上按
照上述的两个步骤把相关jar文件和用到的接口类拷到相应的目录下,把Test.jsp:
文件中的
props.setProperty("java.naming.provider.url","localhost:
1099");这行的
localhost改为EJB组件部署机器的IP,把web应用的工程部署到Tomcat下,启动
Tomcat,就可以看到运行的结果了。
很拽の土豆欢迎交流
2011-4-23制作