軟件需求
要創建EJB 3.0應用程序構建環境,需要使用以下項目:
GlassFish v2 b58d
NetBeans IDE 6.0 Nightly from 03.09.2007
Apache Maven 2.0.7
Mevenide2-Netbeans插件(NetBeans、Maven2項目支持)
假定以上軟件已全部安裝並且運行正常。軟件安裝的方法為將文件解壓到所選目錄中。
要安裝NetBeans Maven2項目支持插件,需要啟動NetBeans IDE 6.0。接下來,選擇 Tools > Plugins 菜單,從出現的對話框中選擇 Available Plugins選項卡並選擇插件。
完整的項目可從 ejb3-remove-stateless.zip獲得.
創建項目結構
2.1 創建父項目——ejb3-remove-stateless
為了使Apache Maven 2(後文簡稱為 m2)運行的項目更具條理性,我們首先將創建一個父項目(主項目)。創建一個pom類型的項目,其中包含兩個子項目——EJB bean模塊和遠程客戶機模塊。
我們也可以手動創建項目——使用 mvn命令,或者使用 NetBeans Maven2 project support插件。使用插件可以簡化環境創建過程,並且可以更輕松地使用m2。有了插件後,我們能夠在IDE級別執行大部分的管理功能。目前,這些功能是通過命令行執行的。
假設NetBeans Maven2項目支持插件已正確安裝,選擇 File > New Project菜單,然後選擇 Maven類別中的 Maven Project。
單擊 Next >
再次單擊 Next > ,選擇 Maven Quickstart Project 原型。
在接下來出來的界面中選擇以下項目設置:
Project Name: ejb3-remove-stateless
Project Location: C:
Group Id: pl.jaceklaskowski.javaee
Version: 1.0
Package: pl.jaceklaskowski.javaee
這些設置可能與前面給出的不同,但是本文後面的內容假設這些內容是相同的。
單擊 Finish完成項目的創建。
現在,我們已經創建了一個jar類型的項目。我們將修改項目的配置,使它能夠履行父項目的角色。選擇新的ejb3-remove-stateless項目,右鍵單擊鼠標並從下拉菜單中選擇 Properties選項。將 Packaging字段的 jar值改為 pom。
我們還需要修改項目的屬性,因為我們要使用Java版本。
單擊 OK,確認修改。
最後一步是刪除 src目錄,它是在創建項目時默認創建的,但我們在這裡不會使用到,至此,項目准備完畢。要刪除目錄,轉到 Files選項卡,選擇 src目錄,並從下拉菜單中選擇 Delete。
從項目中刪除測試庫 junit-3.8.1(我們稍後將修改為版本4.2)。
創建子項目——ejb3-remove-stateless-ejb3
要創建 ejb3-remove-stateless-ejb3 子項目,我們還要再一次使用NetBeans IDE 6.0。我們將執行與創建ejb3-remove-stateless主項目類似的過程,僅僅需要修改目標子項目的位置,使它顯示在主項目的目錄中(類似於在父類別中執行mvn create:archetype命令)。& amp; amp; amp; amp; amp; amp; amp; amp; amp; lt; /p>
選擇以下項目設置:
Project Name: ejb3-remove-stateless-ejb3
Project Location: C:ejb3-remove-stateless
Group Id: pl.jaceklaskowski.javaee
Version: 1.0
Package: pl.jaceklaskowski.javaee
單擊 Finish完成項目創建。
成功創建項目後,由於對模塊ejb3-remove-stateless-ejb3進行了注冊,父項目的pom.xml文件將被修改。
<modules>
<module>ejb3-remove-stateless-ejb3</module>
</modules>
同父項目的處理相同,我們將刪除 junit-3.8.1測試庫。我們還將刪除用於單個測試的 Test Packages庫(方法為選擇 Files 選項卡,展開 ejb3-remove-stateless-ejb3 (jar) > src 文件夾並刪除以感歎號標記的 test目錄)。
我們將對項目進行配置,方法為:將 Packaging改為 ejb。右鍵單擊鼠標,選擇 Properties菜單並在對話框中將 Packaging字段的值由 jar改為 ejb。
單擊 OK確認修改。
刪除 pl.jaceklaskowski.javaee.App類別(從 Source Packages部分)。最後,對項目進行配置,使它包含EJB 3.0 bean。要進行修改必須直接編輯pom.xml文件。我們將在文件配置中添加 maven-ejb-plugin 。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.0</ejbVersion>
</configuration>
</plugin>
pom.xml文件修改完畢後,將看到以下內容:
<?xml version="1.0" encoding="UTF-8"?>
創建子項目——ejb3-remove-stateless-client
<project>
<parent>
<artifactId>ejb3-remove-stateless</artifactId>
<groupId>pl.jaceklaskowski.javaee</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>pl.jaceklaskowski.javaee</groupId>
<artifactId>ejb3-remove-stateless-ejb3</artifactId>
<name>ejb3-remove-stateless-ejb3</name>
<packaging>ejb</packaging>
<version>1.0</version>
<url>http://www.JacekLaskowski.pl</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.0</ejbVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>
我們將創建 ejb3-remove-stateless-client項目,方法與前一個子項目的創建方式相同。但是 Project Location 必須為 ejb3-remove-stateless 父項目目錄。
選擇以下項目設置
Project Name: ejb3-remove-stateless-client
Project Location: C:ejb3-remove-stateless
Group Id: pl.jaceklaskowski.javaee
Version: 1.0
Package: pl.jaceklaskowski.javaee
刪除 junit-3.8.1.jar 測試目錄(測試庫)、pl.jaceklaskowski.javee.App 類別(源代碼包)以及pl.jaceklaskowski.javaee.AppTest測試包,此時,我們已完成了項目的准備階段。
完整的項目結構
項目結構如下所示:
創建EJB bean - Removable
聲明EJB 3.0庫的依賴關系
創建EJB bean的第一步是定義項目依賴關系。
我們將添加EJB 3.0庫,org.apache.geronimo.specs:geronimo-ejb_3.0_spec:1.0.
遠程業務接口——RemovableRemote
我們將在 ejb3-remove-stateless-ejb3 項目中創建遠程業務接口RemovableRemote (類別pl.jaceklaskowski.javaee.RemovableRemote)。
package pl.jaceklaskowski.javaee;
Bean類型——RemovableBean
import javax.ejb.Remote;
@Remote
public interface RemovableRemote {
public void remove(String message);
}
我們將通過實現RemovableRemote業務接口創建bean類型RemovableBean(類別pl.jaceklaskowski.javaee.RemovableBean)。
package pl.jaceklaskowski.javaee;
import javax.ejb.Stateless;
@Stateless(mappedName="Removable")
public class RemovableBean implements RemovableRemote {
public void remove(String msg) {
System.out.println(msg);
}
}
使用@Stateless annotation mappedName屬性可以指定一些名稱,然後使用這些名稱可以通過遠程客戶機搜索EJB bean(有關更多信息,請參閱 How are Global JNDI names assigned to Session / Entity beans?)。
創建遠程客戶機——RemovableClient
根據GlassFish—— How do I access a Remote EJB from a stand-alone java client?中針對bean操作的遠程訪問說明,我們將創建RemovableClient 。
首先,我們將通過 Libraries > Add Library...定義子項目 ejb3-remove-stateless-ejb3(客戶機將使用這個子項目類別)的依賴關系。
添加了依賴關系後,您將在本地庫中看到一條錯誤消息,表示依賴關系是無效的。
要解決這個問題,我們需要構建一個EJB bean——也就是Removable,構建 ejb3-remove-stateless-ejb3 項目,然後將庫放入m2本地庫中。構建方法為選擇 ejb3-remove-stateless-ejb3 項目,右鍵單擊鼠標並從下拉菜單中選擇Build選項。
正確執行這個命令並重新加載 ejb3-remove-stateless-client客戶機項目(菜單 Reload Project)將解決這一問題。
下一步是創建客戶機類——pl.jaceklaskowski.javaee.RemovableClient。這一步非常的簡單,因此不多做說明。客戶機的簡單性源於GlassFish庫——a ppserv-rt.jar,其中包含了JNDI配置。我們還需注意如何使用EJB bean的名稱—— Removable——它是通過@Stateless annotation mappedName屬性在bean類別中定義的。
package pl.jaceklaskowski.javaee;
import javax.naming.Context;
import javax.naming.InitialContext;
public class RemovableClient {
public static void main(String[] args) throws Exception {
Context ctx = new InitialContext();
RemovableRemote removable = (RemovableRemote) ctx.lookup("Removable");
removable.remove("Look at the server's log");
}
}
這時,我們需要添加項目依賴關系,即屬於GlassFish服務器—— appserv-rt.jar的庫以及 system中的 javaee.jar system(根據 System Dependencies)。通過變量glassfish.home查看安裝GlassFish的文件系統的依賴關系,默認位置為 c:/apps/glassfish。
<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<artifactId>ejb3-remove-stateless</artifactId>
<groupId>pl.jaceklaskowski.javaee</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>pl.jaceklaskowski.javaee</groupId>
<artifactId>ejb3-remove-stateless-client</artifactId>
<name>ejb3-remove-stateless-client</name>
<version>1.0</version>
<properties>
<glassfish.home>c:/apps/glassfish</glassfish.home>
</properties>
<dependencies>
<dependency>
<groupId>glassfish</groupId>
<artifactId>appserv-rt.jar</artifactId>
<version>LATEST</version>
<scope>system</scope>
<systemPath>${glassfish.home}/lib/appserv-rt.jar</systemPath>
</dependency>
<dependency>
<groupId>glassfish</groupId>
<artifactId>javaee.jar</artifactId>
<version>LATEST</version>
<scope>system</scope>
<systemPath>${glassfish.home}/lib/javaee.jar</systemPath>
</dependency>
<dependency>
<groupId>pl.jaceklaskowski.javaee</groupId>
<artifactId>ejb3-remove-stateless-ejb3</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>none</include>
</includes>
</configuration>
<executions>
<execution>
<id>run RemovableClientTest</id>
<phase>integration-test</phase>
<configuration>
<includes>
<include>**/RemovableClientTest.java</include>
</includes>
</configuration>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
模塊配置的一個有趣的部分是 maven-surefire-plugin的配置,默認情況下它只執行符合 none模式的測試,以這種方式進行配置(在本例中 none模式意味著不會執行任何測試,因為所有測試都不符合模式,但是執行單個的 RemovableClientTest會更加准確),並且只在完成集成測試階段期間執行。
不管客戶機類的可訪問性如何,我們將從m2級別執行自動啟動,此過程需要借助一個測試——RemovableClientTest( pl.jaceklaskowski.javaee.RemovableClientTest 類別),該測試是通過 Test Packages文件夾構建的。
package pl.jaceklaskowski.javaee;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.junit.Test;
public class RemovableClientTest {
@Test
public void runRemoteClient() throws Exception {
Context ctx = new InitialContext();
RemovableRemote removable = (RemovableRemote) ctx.lookup("Removable");
removable.remove("Look at the server's log");
}
}
這種類型的測試在默認情況下不會啟動(請參考pom.xml文件中的maven-surefire-plugin配置),因為在啟動測試之前,需要在GlassFish應用服務器上先啟動bean(如果修改了測試實現方式,則不能夠創建項目並且也不能在服務器上安裝bean)。
啟動
要啟動項目,首先要在GlassFish服務器上安裝 Removable bean ,然後啟動 RemovableClientTest。
GlassFish服務器啟動
在安裝bean之前,我們先要使用asadmin start-domain命令啟動GlassFish(之前已定義了變量PATH以包含GlassFish bin 目錄)。
$ asadmin.bat start-domain domain1
Starting Domain domain1, please wait.
Log redirected to c:appsglassfishdomainsdomain1logsserver.log.
Redirecting output to C:/apps/glassfish/domains/domain1/logs/server.log
Domain domain1 is ready to receive client requests. Additional services are being started in
background.
Domain [domain1] is running [Sun Java System Application Server 9.1 (build b58d-fcs)]
with its configuration and logs at: [c:appsglassfishdomains].
Admin Console is available at [http://localhost:4848].
Use the same port [4848] for "asadmin" commands.
User web applications are available at these URLs:
[http://localhost:8080 https://localhost:8181 ].
Following web-contexts are available:
[/web1 /__wstx-services ].
Standard JMX Clients (like JConsole) can connect to JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://dev:8686/jmxrmi] for domain management purposes.
Domain listens on at least following ports for connections:
[8080 8181 4848 3700 3820 3920 8686 ].
Domain does not support application server clusters and other standalone instances.
安裝EJB bean——Removable
在創建之前,先要安裝bean 。然而,在定義客戶機依賴關系( ejb3-remove-stateless-client 項目)的過程中實際已經完成了這一步驟。在 ejb3-remove-stateless-ejb3項目target 目錄,存在一個ejb3-remove-stateless-ejb3-1.0.jar文件。這是一個bean分配文件。我們將使用asadmin deploy 命令安裝該文件。
$ asadmin.bat deploy --user admin
ejb3-remove-stateless-ejb3/target/ejb3-remove-stateless-ejb3-1.0.jar
Command deploy executed successfully.
在服務器的管理控制台(默認情況下通過地址 http://localhost:4848訪問),我們將查看EJB Removable bean是否已經正確安裝。
遠程客戶機啟動——RemovableClient
首先,我們將構建完整的ejb3-remove-stateless項目,方法為從菜單中選擇 Build選項。
成功啟動命令後,您將看到以下通知內容:
...
------------------------------------------------------------------------
Reactor Summary:
------------------------------------------------------------------------
ejb3-remove-stateless ................................. SUCCESS [1.500s]
ejb3-remove-stateless-ejb3 ............................ SUCCESS [0.610s]
ejb3-remove-stateless-client .......................... SUCCESS [0.921s]
------------------------------------------------------------------------
------------------------------------------------------------------------
BUILD SUCCESSFUL
------------------------------------------------------------------------
...
當然,選擇 Build選項即可執行在m2中的 安裝 步驟,同時也宣告 集成測試階段的完成,本文的測試也告一段落。
使用mvn integration-test 命令即可立即啟動客戶機,在本文的例子中使用NetBeans IDE 6.0作為圖形工具來啟動m2命令——即選擇 ejb3-remove-stateless-client 項目,右鍵單擊鼠標並從菜單中選擇 Custom > Goals...選項 。
可通過 Build Lifecycle Phases頁面獲得m2階段列表。
接下來我們將執行集成測試階段。
成功啟動測試後,您將在NetBeans IDE看到如下所示的內容:
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running pl.jaceklaskowski.javaee.RemovableClientTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.203 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
------------------------------------------------------------------------
BUILD SUCCESSFUL
------------------------------------------------------------------------
...
同時將在事件的GlassFish日志(GlassFisha主目錄的 domains/domain1/logs/server.log文件)中看到如下內容
[#|2007-09-03T22:41:59.750+0200|INFO|sun-appserver9.1|javax.enterprise.system.stream.out|_ThreadID=16;_ThreadName=p:
thread-pool-1; w: 8;|
Look at the server's log|#]
盡管已經成功啟動了遠程服務器,但並不表示解決方案已經完成。還需要啟動測試來安裝bean。如果在安裝之前嘗試執行
Build選項,則會收到一條錯誤消息。歡迎提出改進建議。接下來的文章將介紹Apache OpenEJB 3.0-SNAPSHOT服務器。