Java Classpath困境

时间:2011-07-30 01:09:59

标签: java classpath

幸运或不幸的是,从命令行调用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目录中,但未找到。它似乎也无法找到主类,这真的很奇怪。我究竟做错了什么?

3 个答案:

答案 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开头的名称是为接口保留的;将接口用作主类似乎有点奇怪。