EJB发布与调用

JBoss中的部署

部署目录:[JBOSS_HOME]/server/config-name/deploy ,JBoss不断的扫描目录的变化

你可以把下列文件拷贝到此目录下:

任何 jar库(其中的类将被自动添加到 JBoss的 classpath 中)

EJB JAR

WAR (Web Appliction aRrchive)

EAR (Enterprise Application aRchive)

包含 JBoss MBean 定义的 XML文件

包含 EJB JAR、WAR 或者 EAR 的解压缩内容,并以.jar、.war或者.ear结尾的目录

要重新部署任何上述文件, 用新版本的文件覆盖以前的就可以了。JBoss会根据比较文件的时间发现改变,然后部署新的文件。

在单独的 Tomcat 或 J2SE 中调用 EJB

根据应用的需要,把调用EJB所依赖的Jar包拷贝Classpath下

把 EJB 接口拷贝Classpath

客户端访问 EJB时必须明确设置 InitialContext环境属性

Properties props = new Properties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url","localhost:1099");

props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");

InitialContext ctx = newInitialContext(props);//如果客户端和jboss运行在同一个jvm,不需要传入props,也还可以在应用的 classpath下放置一个 jndi.properties 文件

在 JBOSS 中的 WEB应用调用 EJB

在Jboss下发布 WEB 应用,需要把 WEB应用打包成 war文件。另外在此环境下调用EJB不需要把EJB 的接口类放入/WEB-INF/classes/目录中,否则在调用 Stateful Bean 就会发生类型冲突,引发下面的例外。

java.lang.ClassCastException: $Proxy84

org.apache.jsp.StatefulBeanTest_jsp._jspService(org.apache.jsp.StatefulBeanTest_jsp:55)

发布在 Jboss下的客户端不需要明确设置 JNDI访问的上下文环境,可以直接通过 InitialContext ctx = newInitialContext()获得上下文环境,容器会自动赋给 InitialContext正确的环境

要发布 EJB 时必须把她打成*.jar文件,一个 EJB 打包后的目录结构如下

EJB 应用根目录

| -- com (你的.class文件)

| -- META-INF

| -- MANIFEST.MF(如果使用工具打包,该文件由工具自动生成)

<?xml version="1.0"?>

<project name="jartest"default="jar" basedir=".">

<property name="build.dir"value="${basedir}/build" />

<property name="build.classes.dir"value="${build.dir}/classes" />

<target name="jar" description="打包成Jar">

<jar jarfile="${basedir}/ejbfile.jar">

<fileset dir="${build.classes.dir}">

<include name="**/*.class"/>

</fileset>

<metainf dir="${basedir}/META-INF">

<include name="**" />

</metainf>

</jar>

</target>

</project>

进行 WEB应用打包

一个 Web 应用发布到 Jboss 服务器时需要打成 war 包

WEB 应用根目录

| -- **/*. jsp

| --WEB-INF

| -- web.xml

| -- lib

| -- *.*

| -- classes

| -- **/*.class

<?xml version="1.0"?>

<project name="wartest"default="war" basedir=".">

<target name="war" description="创建 WEB 发布包">

<war warfile="${basedir}/EJBTest.war"webxml="${basedir}/WEB-INF/web.xml">

<classes dir="${basedir}/WEB-INF/classes"><include name="**/*.class"/> </classes>

<lib dir="${basedir}/WEB-INF/lib"><includename="*.jar"/></lib>

<webinf dir="${basedir}/WEB-INF"><includename="*.*"/></webinf>

</war>

</target>

</project>

webxml 指明web.xml的位置,<classes>>指明 web的 classes 目录位置, <lib>指明 web 的 lib 目录位置, <webinf>指明 web 的 WEB-INF 目录位置

进行企业应用打包

一个完整的企业应用包含EJB模块和 WEB 模块,在发布企业应用时,我们需要把它打成*.ear文件,在打包前我们必须配置 application.xml 文件,该文件存放于打包后的 META-INF 目录。我们在 application.xml 文件中需要指定 EJB 模块和 WEB 模块的信息

一个 application.xml配置例子如下:

<application xmlns="http://java.sun.com/xml/ns/j2ee"version="1.4"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">

<display-name>EJB3Sample Application</display-name>

<module>

<web>

<web-uri>web.war</web-uri>

<context-root>web</context-root>

</web>

</module>

<module>

<ejb>ejb3.jar</ejb>

</module>

</application>

<web>指定 Web 模块,<ejb>指定 EJB 模块,Web 模块或者 EJB 模块都可以存在多个

一个企业应用打包后的目录结构应该如下

ear应用根目录

| -- ejb3.jar (你的 EJB 模块)

| -- web.war (你的 WEB 模块)

| -- META-INF

| -- MANIFEST.MF (如果使用工具打包,该文件由工具自动生成)

| -- application.xml

使用了第三方类库的 EJB打包

可以把第三方类库放入[JBOSS_HOME]\server\default\lib,不过此种方式重新部署 EJB应用时,第三方类库也要重新部署。适合放入应用服务器类路径的第三方类库通常是一些通用类库,如 JDBC 驱动。对于第三方类库最理想的选择是把他们放入 EJB Jar文件中。每一个 JAR 文件里都有一个manifest文件,这个文件由 jar工具自动创建,默认名字是 MANIFEST.MF。我们可以在 manifest文件中加入一个Class-Path 属性,引用它所依赖的 JAR 文件。我们可以手工编辑 manifest.mf 文件,在原有内容的基础上,添加Class-Path 属性。Class-Path 属性的值是用来搜索第三方类库的相对 URL。这个 URL总是相对于包含 Class-Path属性的组件。单个 Class-Path 属性内可以指定多个 URL,一个 manifest文件可以包含多个 Class-Path 属性。

假设本例 EJB 使用了两个第三方类库,名为:Upload.jar,Socket.jar,

修改后的 manifest.mf 文件内容如下:

Manifest-Version: 1.0

Ant-Version: Apache Ant 1.6.5

Created-By: 1.5.0_01-b08 (Sun MicrosystemsInc.)

Class-Path: Upload.jar Socket.jar

Class-Path: 与 Upload.jar之间有一空格分隔(缺少了空格就会发生找不到 jar文件),多个 jar文件之间需要用空格分隔。Class-Path 所在行还需要进行回车换行。

打完包后的目录结构

EJB 应用根目录

| -- com (注:ejb 类包)

| -- Upload.jar (注:第三方类库)

| -- Socket.jar (注:第三方类库)

| -- META-INF

| -- MANIFEST.MF(注:加入了 Class-Path 属性)

共用了第三方类库的 J2EE 应用打包

一个 J2EE 项目通常由多个 EJB 和 Web 应用构成,如果多个 EJB 及 Web 应用共用了一个第三方类库

假设一个 J2EE 项目含有两个 EJB 及一个 Web 应用,他们的文件名分别为:HelloWorld.jar,HelloChina.ja,MyEJBTest.war。这三个模块都使用了一个第三方类库,名为:Tools.jar

现在我们要做的是编辑这三个模块的 manifest.mf 文件,在原有内容的基础上,添加 Class-Path 属性。

三个模块的 jar文件修改后的 manifest.mf 文件内容如下:

Manifest-Version: 1.0

Ant-Version: Apache Ant 1.6.5

Created-By: 1.5.0_01-b08 (Sun MicrosystemsInc.)

Class-Path: Tools.jar

注意:Class-Path: 与 Tools.jar之间有一空格分隔(缺少了空格就会发生找不到 jar文件),Class-Path 所在行还需

要进行回车换行。

各个模块通过 manifest.mf 文件都能找到其所依赖的 Tools.jar文件。

打完包后的目录结构:

J2EE 应用根目录

| -- HelloWorld.jar

| -- META-INF

| -- MANIFEST.MF (注:加入了 Class-Path 属性, 引用它所依赖的 Tools.jar)

| -- HelloChina.jar

| -- META-INF

| -- MANIFEST.MF (注:加入了 Class-Path 属性, 引用它所依赖的 Tools.jar)

| -- MyEJBTest.war

| -- META-INF

| -- MANIFEST.MF (注:加入了 Class-Path 属性, 引用它所依赖的 Tools.jar)

| -- Tools.jar (注:第三方类库)

| -- META-INF

| --application.xml

| -- MANIFEST.MF(注:由工具自动生成,没有加入 Class-Path 属性)

如果第三方类库很多的情况下,显的有些零乱而不雅观可以建个文件夹专门用来存放第三方类库。如建个 lib 文件夹,把第三方类库放在此文件夹下。然后修改J2EE各模块的 manifest.mf 文件内容,修改后的内容如下:

Manifest-Version: 1.0

Ant-Version: Apache Ant 1.6.5

Created-By: 1.5.0_01-b08 (Sun MicrosystemsInc.)

Class-Path: lib/Tools.jar


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值