2

我有一个简单的 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 在编译时可用,但在运行时不可用。关于如何解决这个问题的任何想法?

4

1 回答 1

0

删除以下行:

<scope>compile</scope>

阅读更多关于依赖范围的信息:
http ://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

于 2013-03-05T13:33:43.653 回答