【问题标题】:What is the nature of the dependency between GreeterEJB and GreeterLibrary?GreeterEJB 和 GreeterLibrary 之间的依赖关系的本质是什么?
【发布时间】:2015-04-28 04:40:47
【问题描述】:

GreeterEJB 构建为 JAR 时,它不会使用 libs 文件夹来构建依赖项:

thufir@doge:~$ 
thufir@doge:~$ ll NetBeansProjects/GreeterEJB/dist/
total 20
drwxrwxr-x 2 thufir thufir 4096 Feb 25 14:34 ./
drwxrwxr-x 6 thufir thufir 4096 Feb 25 14:34 ../
-rw-rw-r-- 1 thufir thufir 2802 Feb 25 14:34 GreeterEJB.jar
thufir@doge:~$ 

但是,当它部署时,Glassfish 会给出以下错误:

Error in annotation processing: {0}.
java.lang.NoClassDefFoundError: net/bounceme/doge/greeter/ejb/GreeterRemote

因为,我认为它找不到 GreeterRemote 类,因为该类位于不同的 JAR 中:

thufir@doge:~$ 
thufir@doge:~$ jar -tf NetBeansProjects/GreeterLibrary/dist/GreeterLibrary.jar | grep class
net/bounceme/doge/greeter/ejb/GreeterRemote.class
thufir@doge:~$ 

这种依赖的本质是什么?这与将类添加到项目的类路径有什么不同?至少在 Netbeans 中,例如,当将 JDBC 驱动程序添加到类路径时,该驱动程序将显示在构建的 JAR 旁边的 libs 文件夹中。

ejb:

package net.bounceme.doge.greeter.ejb;

import javax.ejb.Stateless;

@Stateless
public class GreeterBean implements GreeterRemote {

    @Override
    public String greeting() {
        return "hello remote world";
    }

}

欢迎远程接口:

package net.bounceme.doge.greeter.ejb;

import javax.ejb.Remote;

@Remote
public interface GreeterRemote {

    String greeting();
    
}

GreeterLibrary JAR 文件添加到 glassfish:

thufir@doge:~$ 
thufir@doge:~$ ll glassfish-4.1/glassfish/lib/*.jar
-rw-r--r-- 1 thufir thufir    2694 Feb 22 18:56 glassfish-4.1/glassfish/lib/appserv-rt.jar
-rw-rw-r-- 1 thufir thufir   20020 Feb 25 06:06 glassfish-4.1/glassfish/lib/EJBRemoteInterface.jar
-rw-r--r-- 1 thufir thufir   22189 Feb 22 18:56 glassfish-4.1/glassfish/lib/gf-client.jar
-rw-r--r-- 1 thufir thufir    3193 Feb 22 18:56 glassfish-4.1/glassfish/lib/javaee.jar
-rw-r--r-- 1 thufir thufir    1398 Feb 22 18:56 glassfish-4.1/glassfish/lib/jndi-properties.jar
-rw-r--r-- 1 thufir thufir 1006015 Feb 23 16:58 glassfish-4.1/glassfish/lib/mysql-connector-java.jar
thufir@doge:~$ 
thufir@doge:~$ ll glassfish-4.1/glassfish/domains/domain1/lib/*.jar
-rw-rw-r-- 1 thufir thufir 20020 Feb 25 06:06 glassfish-4.1/glassfish/domains/domain1/lib/EJBRemoteInterface.jar
thufir@doge:~$ 
thufir@doge:~$ ll glassfish-4.1/glassfish/domains/domain1/lib/classes/*.jar
-rw-rw-r-- 1 thufir thufir 20020 Feb 25 06:06 glassfish-4.1/glassfish/domains/domain1/lib/classes/EJBRemoteInterface.jar
thufir@doge:~$ 

我记得以前用远程接口做something like this,但我似乎忘记了远程接口的关键步骤,目前找不到合适的谷歌术语。我确信 Glassfish 手册中的某处有关于 EJB 依赖项及其去向的部分......

现在,我只想知道依赖的性质类型,这样我至少知道谷歌是为了什么。

【问题讨论】:

    标签: java netbeans ant jar glassfish


    【解决方案1】:

    您不想将自己开发的依赖项放在 Glassfish lib 文件夹中。这可能足以用于生产用途,但不适用于开发。

    要做到这一点,您需要一个 EAR。

    在 EAR 中,您可以为您的依赖项创建一个 lib 文件夹。

    EAR 结构将如下所示:

    /EAR
    /EAR/GreeterEJB.jar
    /EAR/lib
    /EAR/lib/GreeterLibrary.jar
    

    【讨论】:

    • 我认为 Glassfish 可以make some better doc's 对此。无论如何,我在github 上的解决方案。我想我把 javaee-api-7.0.jar 放在所有东西中有点过火了,但是,它运行......而且,至少对我来说,EJB 模块构建为 JAR......它只是一个模块,而不是一个企业应用程序...(?)
    • 这与 Glassfish 无关,当您使用 Java EE 并拥有一个引用 lib jar 的 EJB 时,它是一般部署“事情”。你是对的,一个普通的 EJB 项目将构建单个 jar 文件,你必须构建一个单独的 EAR 项目来引用 EJB jar。
    • EAR lib 文件夹简化了部署?这通常会包括javae-api-7.0jar,还是表明存在潜在问题?
    • 如果您需要打包 EJB 模块的依赖项,则需要 EAR 中的 lib 文件夹,但也可以用于保存 EAR 中所有模块的共享库(可能是多个 EJB 和一个战争)。如果您部署到 Glassfish,则无需将 javaee-api-7.0.jar 与您的 Web 应用程序打包在一起,因为它已包含在 Glassfish 库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2010-10-21
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多