在编译时可见的Maven 3 ejb-client依赖关系在ejb 3.1 app client的运行时不可见

时间:2013-02-19 07:10:52

标签: maven-3 glassfish-3 ejb-3.1

我有一个简单的EJB 3.1项目,它使用Glassfish 3.1.2作为AS和Maven 3进行依赖管理。在ejb项目的pom.xml中,我将generateClient选项设置为true。我成功地将我的耳朵部署到服务器,然后我尝试创建一个简单的独立客户端。这是客户端的pom.xml:

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>duan</groupId>
   <artifactId>ejb31-app-client</artifactId>
   <version>1.0-SNAPSHOT</version>
   <name>ejb31-app-client</name>
   <description>my app client</description>

<dependencies>
    <dependency>
        <groupId>org.glassfish.main.appclient.client</groupId>
        <artifactId>gf-client-module</artifactId>
        <version>3.1.2</version>
        <type>pom</type>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
            <artifactId>tools</artifactId>
            <groupId>com.sun</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>duan</groupId>
        <artifactId>ejb31</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>ejb-client</type>
    </dependency>
</dependencies>

其中ejb31是我为其生成客户端的ejb项目。

我的应用程序客户端中使用的Java类是:

public class Test {
private static HelloWorldBeanRemote helloWorldBean;

public static void main(String[] args) {
    String jndiPath = "java:global/ejb31-ear-1.0/ejb31-ejb/HelloWorldBean";

    try {
        Context ctx = new InitialContext();
        System.out.println("Looking up bean at: " + jndiPath);
        helloWorldBean = (HelloWorldBeanRemote) ctx.lookup(jndiPath);
        System.out.println("Found helloWorldBean:" + helloWorldBean);
        System.out.println("Calling sayHello():");
        String greeting = helloWorldBean.sayHello();
        System.out.println("HelloWorldBean said:" + greeting);
    } catch (NamingException e) {
        System.err.println("Could not find HelloWorldBeanRemote!");
        System.err.println("JNDI path used for lookup:" + jndiPath);
        e.printStackTrace();
    }
}

}

Maven编译应用程序客户端没有问题。如果我从Eclipse运行它,我得到这个例外:

Caused by: java.lang.ClassNotFoundException: ro.duan.ejb.HelloWorldBeanRemote
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:688)
    at com.sun.ejb.EJBUtils.loadGeneratedRemoteBusinessClasses(EJBUtils.java:463)
    at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:414)
    ... 7 more

但是如果我手动将ejb-client.jar添加到构建路径,它就像一个魅力。所以我的结论是,不知何故ejb-client.jar在编译时可用,但不能在运行时使用。有关如何解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:0)

删除以下行:

<scope>compile</scope>

详细了解依赖范围:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope