GreeterEJB 和 GreeterLibrary 之间依赖的本质是什么?
What is the nature of the dependency between GreeterEJB and GreeterLibrary?
当 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
class,因为 class 在不同的 JAR 中:
thufir@doge:~$
thufir@doge:~$ jar -tf NetBeansProjects/GreeterLibrary/dist/GreeterLibrary.jar | grep class
net/bounceme/doge/greeter/ejb/GreeterRemote.class
thufir@doge:~$
这种依赖性的本质是什么?这与将 class 添加到项目的 class 路径有何不同?至少在 Netbeans 中,例如,当 JDBC 驱动程序添加到 class 路径时,该驱动程序将与构建的 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";
}
}
greeter 远程接口:
package net.bounceme.doge.greeter.ejb;
import javax.ejb.Remote;
@Remote
public interface GreeterRemote {
String greeting();
}
添加到 glassfish 的 GreeterLibrary JAR 文件:
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,但我似乎忘记了远程接口的关键步骤,目前找不到合适的 Google 术语。我确定在 Glassfish 手册的某处有一个关于 EJB 依赖项及其去向的部分...
现在,我只想知道依赖性的性质或类型,这样我至少知道要Google 为.
您不想将自己开发的依赖项放在 Glassfish lib 文件夹中。这可能足以用于生产用途,但不适用于开发。
要做到正确,您需要一个 EAR。
在 EAR 中,您可以为依赖项创建一个 lib
文件夹。
EAR 结构类似于:
/EAR
/EAR/GreeterEJB.jar
/EAR/lib
/EAR/lib/GreeterLibrary.jar
当 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
class,因为 class 在不同的 JAR 中:
thufir@doge:~$
thufir@doge:~$ jar -tf NetBeansProjects/GreeterLibrary/dist/GreeterLibrary.jar | grep class
net/bounceme/doge/greeter/ejb/GreeterRemote.class
thufir@doge:~$
这种依赖性的本质是什么?这与将 class 添加到项目的 class 路径有何不同?至少在 Netbeans 中,例如,当 JDBC 驱动程序添加到 class 路径时,该驱动程序将与构建的 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";
}
}
greeter 远程接口:
package net.bounceme.doge.greeter.ejb;
import javax.ejb.Remote;
@Remote
public interface GreeterRemote {
String greeting();
}
添加到 glassfish 的 GreeterLibrary JAR 文件:
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,但我似乎忘记了远程接口的关键步骤,目前找不到合适的 Google 术语。我确定在 Glassfish 手册的某处有一个关于 EJB 依赖项及其去向的部分...
现在,我只想知道依赖性的性质或类型,这样我至少知道要Google 为.
您不想将自己开发的依赖项放在 Glassfish lib 文件夹中。这可能足以用于生产用途,但不适用于开发。
要做到正确,您需要一个 EAR。
在 EAR 中,您可以为依赖项创建一个 lib
文件夹。
EAR 结构类似于:
/EAR
/EAR/GreeterEJB.jar
/EAR/lib
/EAR/lib/GreeterLibrary.jar