學到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.
原始碼:Github --- Hello project 二、建立項目
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;@Remotepublic 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;@Statelesspublic class HelloBean implements Hello {@Overridepublic String sayHello(String name) {return "Hello: " + name;}} 一個很簡單的方法,給name變數加上“Hello: ”,然後返回。
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 {@EJBprivate static Hello hello;/** * @param args */public static void main(String[] args) {System.out.println(hello.sayHello("David"));}} hello變數用了@EJB註解來表示此變數使用容器依賴注入,然後在main方法中調用它的sayHello方法,並傳遞變數“David”。再看META-INF下的MANIFEST.MF檔案,它的內容是:
Manifest-Version: 1.0Class-Path: helloEJB.jarMain-Class: com.hello.client.HelloTest
Class-Path是之前在選擇helloEJB項目依賴時自動添加的,Main-Class是指定包含main方法的類,這個是必須的,一會兒運行這個項目時就會知道。然後再有一個檔案很重要,weblogic-application-client.xml檔案,它是這樣被建立的,在META-INF下建立一個檔案,選擇Oracle WebLogic Application Client Descriptor:
點下一步,輸入名字:weblogic-application-client.xml.
它的內容是:
<?xml version="1.0" encoding="UTF-8"?><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>
這個檔案是專門用來描述Application Client項目的,若要引用EJB模組,這個檔案是必須的,它指定了要引用ejb模組的變數的名稱和所在的類,以及
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注入成功。做這個項目之前還有幾個測試專案,折騰的時間更長,還熬夜查資料,做不出來就堅決不睡覺,現在終於可以鬆口氣休息了。