【问题标题】:commandline tool Glassfish appclient doesn't see deployed EJB命令行工具 Glassfish appclient 看不到已部署的 EJB
【发布时间】:2017-07-05 13:24:00
【问题描述】:

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

我在服务器上部署了一个简单的无状态会话 bean SimpleSessionBean,我正在尝试通过 SessionBeanClient 和 Glassfish 命令行工具 appclient 接近该 SimpleSessionBean,运行客户端 jar。书中的一切,所以它应该工作。但是客户端找不到 SimpleSessionBean。显然是类路径问题。在服务器日志中没有发生任何事情。

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

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

提前感谢您的任何建议!

UPDATE1:错误信息

从我运行 appclient 的 bash 终端窗口:

[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 错误 严重:类 [ Lnet/ensode/glassfishbook/SimpleSession; ] 未找到。

加载 [ class net.ensode.glassfishbook.SessionBeanClient ] 时出错 线程“主”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 文件 appclient 实用程序的。要构建这个 JAR 文件,只需调用 mvn 组装:从命令行组装。

解决方案:可以说,缺少的链接是生成带有附加 jar 的“on board”的客户端 jar。进行如下操作(至少在 Eclipse 中):选择 pom.xml > 右键单击​​ > Run As > Maven build... > 在目标字段中输入: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 终于被正确调用了。

【问题讨论】:

  • "客户端却找不到 SimpleSessionBean。"错误信息是什么?
  • “显然是类路径问题”为什么?
  • 有关错误消息,请参阅原始问题帖子中的 UPDATE1。

标签: glassfish java-ee-7


【解决方案1】:

你的假设是正确的。

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

来自older book online

...通过 appclient 实用程序执行。此实用程序可在以下位置找到 【glassfish安装目录】/glassfish/bin/. 假设这条路径 在 PATH 环境变量中,并假设我们放置了我们的客户端 在名为 simplesessionbeanclient.jar 的 JAR 文件中的代码,我们将 通过在 命令行:

appclient -client simplesessionbeanclient.jar

看来你是从

开始的

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

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

试试

appclient -client simplesessionbeanclient.jar

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

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

(再次从 simplesessionbeanclient.jar 所在的文件夹)

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

jar tf simplesessionbeanclient.jar

如果有 SimpleSession.class

【讨论】:

  • 这本书说出了你的建议。但是,如果我运行该语句“./appclient -client simpl*.jar”,错误消息是:“无法访问 jarfile simplesessonbeanclient.jar”。该路径“6886EN ...”顺便说一句是指向 Eclipse 工作区的路径,在我通过 Glassfish 控制台手动将其部署到 Glassfish 之前,我从那里构建了 jar。显然我需要使用 client.jar,因为它部署在服务器中,而不是 Eclipse 工作区。
  • 我在原始帖子中添加了 UPDATE2。也许问题的关键就在那里。将单个 jar 添加到类路径中不是正确的解决方案。在 Eclipse 中看不到选项 mvn assemby:assembly。需要弄清楚如何以这种方式生产罐子。
  • “显然我需要使用 client.jar,因为它部署在服务器中”
  • 当然,你是对的。也许这是一个有用的链接:stackoverflow.com/questions/15461053/…
  • "./appclient -client simpl*.jar"
【解决方案2】:

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

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

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

在运行appclient.bat -client simplesessionbeanclient-jar-with-dependencies.jar 时,我不断收到:

java.lang.ClassNotFoundException: <mainclass>

错误。这是因为 POM 正在组装带有 &lt;mainClass&gt; 值为“net.ensode.glassfishbook.SessionBeanClient”(而不是“net.ensode.javaee8book.SessionBeanClient”)的清单。所以我决定避免为appclient.bat 使用-client 选项并切换到-classpath,它允许我在命令行上指定主类(这比更新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 部署截图:

或者

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

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

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2020-12-18
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多