學到EJB方面的內容,遇到了很多問題,翻閱了無數遍Java EE和Weblogic的官方文檔,在google上進行了無數次搜索都沒有答案,可能我要找的答案太冷門。這一切都起源於Java EE官方文檔里的“cart”例子,我被他迷惑了整整一天。因為這個項目在Netbeans+GlassFish環境下可以運行的很好,直接右擊項目,點運行就可以了。結果拿到Eclipse來,碰到了一堆問題,不是注入的EJB變量為Null要不就是找不到類。經過一天的摸索,現在終於有點頭緒了,現在整理出來,希望可以幫助大家。而大家可能有更好的方法或者對我的敘述有疑問和意見,請大膽評論。
一、應用環境
本文假設您已經有了Eclipse或Spring Source Tool和Weblogic的配置經驗。本項目是用Application Client project來訪問EJB模塊,比直接用Java EE容器管理的Web項目要復雜,因為web client與EJB模塊在同一容器,可以很方便的使用Dependency Injection(依賴注入)。而Application Client是運行在單獨的Application Client Container之中,它需要與Java EE容器交互,獲取容器里的資源,就需要一些額外的設置。
所用工具:Spring Source Tool(本質上還是Eclipse,通用),weblogic command tool.
二、創建項目
1、新建一個Enterprise Application Project。
右擊Package Explorer空白處,選擇New->Other.
然后在Java EE下面選擇Enterprise Application Client
點Next,填寫項目基本信息,在這里我新建了一個hello項目,運行環境就選擇weblogic。
在這個界面勾選Generate application.xml deployment descriptor,然后點擊New Module來創建EJB和Client。
取消Web module,這里我們不創建Web Client和Connector。為Application client和EJB模塊命名,之后點finish。
Eclipse就為我們生成了如下三個項目,helloClient-應用程序客戶端,helloEJB-EJB模塊,還有一個hello是負責把這兩個模塊打包成EAR部署到Weblogic。
2、編寫EJB模塊代碼
EJB模塊的代碼結構如下:
其中hello.ejb.interfaces包下的Hello.java是一個遠程業務接口,即運行在不同Java虛擬機里的client也可以訪問它提供的服務,代碼如下:
-
package hello.ejb.interfaces;
-
-
import javax.ejb.Remote;
-
-
-
public interface Hello {
-
-
public String sayHello(String name);
-
-
}
HelloBean是一個stateless session bean。當然stateful也可以,畢竟就這一個Application Client,它的代碼如下:
-
package hello.ejb;
-
-
import javax.ejb.Stateless;
-
-
import hello.ejb.interfaces.Hello;
-
-
-
public class HelloBean implements Hello {
-
-
-
public String sayHello(String name) {
-
return "Hello: " + name;
-
}
-
-
}
3、設置Application Client
右擊helloClient,選擇properties。
打開Deployment Aseembly菜單,選擇Manifest Entries,點Add...,把helloEJB.jar添加進去,添加此包是為了編譯時不出錯。點Finish。
helloClient的結構如圖:
先看HelloTest.java的代碼(我把默認生成的Main類刪除了):
-
package com.hello.client;
-
-
import javax.ejb.EJB;
-
-
import hello.ejb.interfaces.Hello;
-
-
public class HelloTest {
-
-
-
private static Hello hello;
-
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
-
System.out.println(hello.sayHello( "David"));
-
-
}
-
-
}
-
Manifest-Version: 1.0
-
Class-Path: helloEJB.jar
-
Main-Class: com.hello.client.HelloTest
點下一步,輸入名字:weblogic-application-client.xml.
它的內容是:
-
-
<wls:weblogic-application-client xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application-client"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-
http://java.sun.com/xml/ns/javaee/javaee_5.xsd
-
http://xmlns.oracle.com/weblogic/weblogic-application-client
-
http://xmlns.oracle.com/weblogic/weblogic-application-client/1.3/weblogic-application-client.xsd">
-
-
<!-- 定義要引用的EJB模塊的JNDI名字 -->
-
<wls:ejb-reference-description>
-
<!-- 要使用EJB的變量 -->
-
<wls:ejb-ref-name>com.hello.client.HelloTest/hello</wls:ejb-ref-name>
-
-
<!-- JNDI命名規則:java:global/[應用程序名]EJB模塊名/Bean名 -->
-
<wls:jndi-name>java:global/hello/helloEJB/HelloBean</wls:jndi-name>
-
</wls:ejb-reference-description>
-
-
</wls:weblogic-application-client>
EJB模塊的JNDI名稱,java:global是用來查找remote業務服務接口的。可以從weblogic console里面找到應用程序名,EJB模塊名和Bean名。
4、導出Application Client與EJB包
由於WebLogic的OEPE插件不能直接在Eclipse下運行Application Client,所以我們需要把它和它引用的EJB包導出來,在命令行運行。右擊helloClient,
選擇Export:
然后選擇Java EE下的App Client Jar file
指定Jar包的名稱和路徑。
點Finish創建,同樣的helloEJB,選擇EJB下的EJB JAR file,過程與App client jar file一樣,這兩個jar包都要放在同一個路徑下。
5、運行helloClient
把hello這個Enterprise Application部署到WebLogic下,helloEJB和helloClient也會自動部署:
然后先設置WebLogic的環境變量,進入WebLogic安裝目錄,路徑如下(根據自己的安裝路徑):
里面有setWLSEnv.cmd文件,是用來臨時設置環境變量的,在cmd中運行它:
出現Your enviroment has been set即設置成功。現在可以運行我們的helloClient了,在命令行進入你放置helloClient.jar和helloEJB.jar的文件夾,運行如下命令:
java weblogic.j2eeclient.Main helloClient.jar t3://localhost:7001,這個是weblogic的命令行工具,一般這樣使就夠了,最多后面還可以傳遞幾個main方法里的參數。
出現Hello: David,調用成功。如果當時沒有定義weblogic-application-client.xml的話,就會出現如下錯誤:
三、結束
通過這個項目,對weblogic發布Java EE項目更加熟悉了,而且也了解了怎樣使用WebLogic的t3協議訪問它的實例,並且使helloClient中的EJB變量hello注入成功。做這個項目之前還有幾個測試項目,折騰的時間更長,還熬夜查資料,做不出來就堅決不睡覺,現在終於可以松口氣休息了。