在Glassfish上使用@EJB注释和Maven的应用程序客户端

时间:2013-03-17 13:06:21

标签: java maven glassfish ejb application-client

NetBeans网站how to create Application Client中有一个使用简单项目(没有Maven)的示例。需要4个项目(EJB,EAR,Lib,Program)。本教程很简单,效果很好。

我想问一下如何对Maven做同样的事情?我无法正确地获取所有依赖项,所以当我尝试调用EJB方法时,它会给我NullPointerException。谁能告诉我,需要完成的关键步骤(使用NetBeans优先)?因为我很困惑,需要创建多少个项目?我知道,我需要Application Project,EAR和EJB项目,这就是它吗?需要在这些项目pom.xml文件中编写哪些特殊配置?

EDIT1:

我不想显式JNDI我希望能够使用@EJB注释。

2 个答案:

答案 0 :(得分:3)

以下是步骤:

  1. 使用Maven的New Project菜单文件夹创建Java类库以保存接口类。选择Maven文件夹下的Java Application。
  2. 按照NB的教程创建企业应用程序。唯一的区别是你必须使用Maven的New Project菜单文件夹
  3. 构建类库
  4. 确保类库是企业应用程序中的依赖项。
  5. 运行Enterpise应用程序。 NB会将其部署到GF服务器
  6. 使用Maven的文件夹创建Application Client。不要使用插入代码 NB的功能在这里注入无状态EJB,因为它崩溃了(至少在我的版本中:NB 7.2)。而只需复制并粘贴教程中显示的代码。您不需要任何部署/ ejb描述符。
  7. 修改应用程序客户端的POM,以便使用maven-assembly-plugin获取具有依赖关系的jar。如果不执行此步骤,则部署将失败,因为GF无法加载接口类。将以下行添加到plugins选项卡(根据需要更改主类):

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.entapp.entappclient.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> 
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    
  8. 使用NB构建应用程序客户端项目

  9. 使用GF的应用程序客户端命令运行应用程序客户端:appclient -jar EntAppClient-1.0-SNAPSHOT-jar-with-dependencies.jar
  10. 有用的链接:Jason Lee的Java EE's Buried Treasure: the Application Client Container

    重要提示

    为了将客户端部署到其他JVM you have to install the appclient on each client machine并设置目标服务器属性。 appclient似乎有一个非常复杂的结构,你不能简单地通过添加这些行来生成(加上EclipseLink持久性工件):

    <dependency>
        <groupId>org.glassfish.appclient</groupId>
        <artifactId>gf-client</artifactId>
        <version>3.1.1</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>
    

    将这些工件添加到客户端可以完美地编译,但jar不起作用。这是可以理解的,因为缺少文件sun-acc.xml(此文件是必需的,因为它包含target-server属性)。 因此我认为唯一的方法是根据链接文档使用package-appclient脚本

答案 1 :(得分:0)

有一个有用的EJB FAQ提到了如何使用@EJBejb-ref一起使用sun-web.xml来访问远程EJB,现在它是{ {1}}如下链接: -

What if I have multiple instances of the Appserver running and I want to access a Remote EJB component between them?

如果您想在glassfish-web.xmlejb-ref之间进行比较,可以在What is the relationship between @EJB and ejb-ref/ejb-local-ref?

看到更多信息

我希望这可能有所帮助。