程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用GlassFish v2、Apache Maven 2和NetBeans IDE 6.0構建EJB 3

使用GlassFish v2、Apache Maven 2和NetBeans IDE 6.0構建EJB 3

編輯:關於JAVA

軟件需求

要創建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"?>
<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

我們將創建 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;
import javax.ejb.Remote;
@Remote
public interface RemovableRemote {
  public void remove(String message);
}
Bean類型——RemovableBean

我們將通過實現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服務器。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved