命令行工具 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。
...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.java
和 SimpleSessionBean.java
从“simplesessionbean”项目复制到“simplesessionbeanclient”项目来手动编译客户端以包含所有依赖项(记得重构包语句)。这将生成包含 EJB 的 simplesessionbeanclient.jar
(注意:您仍然必须将 EJB 部署到 GlassFish 服务器)。还要确保 POM 中的 <mainClass>
元素指向正确的包。
您现在可以使用 -client
选项:
我正在阅读一本关于 "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。
...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.java
和 SimpleSessionBean.java
从“simplesessionbean”项目复制到“simplesessionbeanclient”项目来手动编译客户端以包含所有依赖项(记得重构包语句)。这将生成包含 EJB 的 simplesessionbeanclient.jar
(注意:您仍然必须将 EJB 部署到 GlassFish 服务器)。还要确保 POM 中的 <mainClass>
元素指向正确的包。
您现在可以使用 -client
选项: