幸运或不幸的是,从命令行调用java
到目前为止,我没有必要过多地工作,我通常使用类似Maven,Ant或在servlet容器中运行的东西。我刚刚使用程序集将我在Maven中的应用程序编译成一个JAR:单个目标,并且从命令行运行它时遇到严重问题。
这是我正在尝试做的事情:
export JAVA_CLASSPATH="`pwd`:/path/to/remote/libs/"
java -cp "${JAVA_CLASSPATH}" -jar groupId-artifactId-version-jar-with-dependencies.jar com.my.main.Class
失败时出现以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/remote/lib/IServer
Caused by: java.lang.ClassNotFoundException: com.remote.lib.IServer
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: com.my.main.Class. Program will exit.
IServer
类位于/path/to/remote/libs
目录中,但未找到。它似乎也无法找到主类,这真的很奇怪。我究竟做错了什么?
答案 0 :(得分:4)
-jar选项忽略类路径(和所有其他)选项。
您需要在jar中编辑清单文件,并在那里设置Class-path变量。
http://download.oracle.com/javase/1.4.2/docs/tooldocs/linux/java.html
答案 1 :(得分:2)
@ Kal的答案是正确的,但更容易解决的方法是:
export JAVA_CLASSPATH="groupId-artifactId-version-jar-with-depencies.jar:`pwd`:/path/to/remote/libs/iserver.jar"
java -cp "${JAVA_CLASSPATH}" com.my.main.Class
无需修改清单文件;只需将您想要的jar添加到类路径中。
此外,如果IServer内容位于/path/to/remove/libs/
内的jar中,则需要显式包含jar文件的名称。我把它包括在上面,并假设它被称为“iserver.jar”
如果您有许多依赖项,那么编写用于启动代码的shell脚本通常会更容易。该脚本可以使用shell glob goodness构建一个(可能非常大的)类路径字符串。 java可执行文件不做任何通配。
编辑:请注意,我假设您不可以访问Ant或Maven或任何这些好东西,因为您声明您通常使用这些工具但不执行此操作现在。
答案 2 :(得分:0)
必须使用jar文件的确切路径指定classpath参数。如果在server.jar
中找到了您的IServer类,则需要指定"$pwd\:/path/to/remote/libs/server.jar"
。 (换句话说,你需要包含一个:
- 分隔jar文件路径列表)
正如其他人所说,如果选择此方法,则应删除-jar
参数,而是在命令行中包含您打算成为主类的类名,例如java -cp $PWD:/path/to/server.jar com.remote.lib.IServer
。< / p>
旁注:通常以I
开头的名称是为接口保留的;将接口用作主类似乎有点奇怪。