命令行工具 Glassfish appclient 看不到已部署的 EJB

commandline tool Glassfish appclient doesn't see deployed EJB

我正在阅读一本关于 "Java EE 7 for Glassfish" 的书,服务器安装在 Fedora Linux。

我在服务器上部署了一个简单的无状态会话 bean SimpleSessionBean,我正在尝试通过 SessionBeanClient 和 Glassfish 命令行工具访问该 SimpleSessionBean appclient,运行设置一个客户端 jar。书中的所有内容,所以它应该有效。然而,客户端找不到 SimpleSessionBean。显然是 class 路径问题。在服务器日志中没有任何反应。

我找不到任何关于如何正确安装 Glassfish 的指示。一切都在服务器内工作。我可以在浏览器中从 facelets 运行ning 中安装 war 文件。

这可能是正确设置 $PATH 或其他环境变量的问题。有相关文献的指点吗?

提前感谢您的任何建议!

UPDATE1:错误消息

从 bash 终端 window 我 运行 appclient:

[fedora@localhost bin]$ ./appclient -client /home/fedora/Downloads/6886EN_04_Code/ch04_src/simplesessionbeanclient/target/simplesessionbeanclient.jar

2017 年 7 月 6 日 12:52:57 下午 org.glassfish.apf.impl.DefaultErrorHandler 错误 严重:Class [Lnet/ensode/glassfishbook/SimpleSession; ] 未找到。

加载时出错[classnet.ensode.glassfishbook.SessionBeanClient] 线程 "main" java.lang.NoClassDefFoundError 中的异常:net/ensode/glassfishbook/SimpleSession 在 net.ensode.glassfishbook.SessionBeanClient.invokeSessionBeanMethods(SessionBeanClient.java:12) 在 net.ensode.glassfishbook.SessionBeanClient.main(SessionBeanClient.java:19) 原因:java.lang.ClassNotFoundException:net.ensode.glassfishbook.SimpleSession 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 org.glassfish.appclient.client.acc.ACCClassLoader.findClass(ACCClassLoader.java:237) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)

UPDATE2:来自 Glassfish 书:

我们正在使用 Maven 来构建我们的代码。对于这个例子,我们使用 Maven Assembly 插件 (http://maven.apache.org/plugins/maven-assembly-plugin/) 构建客户端 JAR 文件 包括所有依赖项;这使我们不必指定 -classpath 命令行选项中的所有依赖 JAR 文件 应用程序实用程序。要构建此 JAR 文件,只需调用 mvn assembly:assembly 来自命令行。

解决方案:丢失的 link 正在生成一个客户端 jar,可以这么说。如下进行(至少在 Eclipse 中): select pom.xml > 右键单击​​ > 运行 As > Maven build... > 在 Goals 字段中输入: assembly:assembly> Apply/Run。

结果是您会在目标文件夹下找到两个 jar:xxxclient.jar 和 xxxclient-jar-with-dependencies.jar。 从 bash 中的命令行从带有后一个 jar 的文件夹中执行:

/path_to/appclient -client xxxclient-jar-with-dependencies.jar

经过很长时间的等待(在我 200 美元的迷你 Linux 盒子上)HelloWorld-ish 服务器 EJB 终于被正确调用。

你的假设是正确的。

您的 class 路径中缺少 net.ensode.glassfishbook.SimpleSession。

来自 older book online:

...executed through the appclient utility. This utility can be found at [glassfish installation directory]/glassfish/bin/. Assuming this path is in the PATH environment variable, and assuming we placed our client code in a JAR file called simplesessionbeanclient.jar, we would execute the above client code by typing the following command in the command line:

appclient -client simplesessionbeanclient.jar

看来你是从

开始的

.../bin/./appclient -client /home/fedora/Downloads/6886EN_04_Code/ch04_src/simplesessionbeanclient/target/simplesessionbeanclient.jar

您的 CLASSPATH 中需要 SimpleSession.class(或 class 路径中的 jar)。 通常 java 首先检查当前目录(即您的 bin 文件夹)。如果未找到 class(它不是,因为它在您的 simplesessionbeanclient 文件夹中),它会在 class 路径(您没有添加 simplesessionbeanclient 文件夹)中搜索 class。

尝试

appclient -client simplesessionbeanclient.jar

来自 simplesessionbeanclient.jar 所在的文件夹。 如果您不想将 appclient 文件夹添加到您的路径,请以

开头
/your/path/to/appclient -client simplesessionbeanclient.jar

(同样来自simplesessionbeanclient.jar所在的文件夹)

更新: 如果您仍然遇到 ClassNotFoundException,请查看您的 jar 文件中是否缺少它(jar 是 Zip 文件,您可以使用 Zip 工具):

jar tf simplesessionbeanclient.jar

如果有 SimpleSession.class

我执行了以下操作来解决我的问题:

  • 使用appclient -classpath(而不是appclient -client
  • 使用常规项目 JAR(而不是 mvn assembly:assembly 生成的 JAR)
  • 将 EJB 部署到 Glassfish (simplesessionbean.jar)

David R. Heffelfinger(“Java EE 7 for Glassfish”的同一作者)最近出版的一本书“Java EE 8 应用程序开发”中的示例代码几乎与相同(唯一的细微差别是 classes 打包在“net.ensode.javaee8book”而不是“net.ensode.glassfishbook”中)。

当 运行 appclient.bat -client simplesessionbeanclient-jar-with-dependencies.jar 我不断得到:

java.lang.ClassNotFoundException: <mainclass>

错误。这是因为 POM 正在组装一个 <mainClass> 值为“net.ensode.glassfishbook.SessionBeanClient”(而不是“net.ensode.javaee8book.SessionBeanClient”)的清单。所以我决定避免对 appclient.bat 使用 -client 选项并切换到 -classpath 这允许我在命令行上指定主要的 class (这比更新更容易POM 或重构包以适应清单)。

但是当 运行 appclient 命令时:

PS C:\home\programs\java_ee_sdk-8u1\glassfish5\glassfish\bin> .\appclient.bat -classpath "C:\home\code\Java-EE-8-Application-Development-Code-Samples-master\ch04_src\simplesessionbean\target\simplesessionbean.jar;C:\home\code\Java-EE-8-Application-Development-Code-Samples-master\ch04_src\simplesessionbeanclient\target\simplesessionbeanclient.jar" net.ensode.javaee8book.SessionBeanClient

我不断得到:

Root exception is javax.naming.NameNotFoundException: net.ensode.javaee8book.SimpleSession#net.ensode.javaee8book.SimpleSession not found]] 

错误。这是通过管理控制台将 EJB (simplesessionbean.jar) 部署到 Glassfish 解决的(本书中没有提到这个缺失的步骤)。 运行 然后 appclient.bat 命令起作用了。

appclient.bat 的屏幕截图(加载大约需要 15 秒):

EJB 部署的屏幕截图:

或者

您可以通过将 SimpleSession.javaSimpleSessionBean.java 从“simplesessionbean”项目复制到“simplesessionbeanclient”项目来手动编译客户端以包含所有依赖项(记得重构包语句)。这将生成包含 EJB 的 simplesessionbeanclient.jar(注意:您仍然必须将 EJB 部署到 GlassFish 服务器)。还要确保 POM 中的 <mainClass> 元素指向正确的包。

您现在可以使用 -client 选项: