Java类路径的困境
幸运或不幸的是,我不需要从命令行调用Java类路径的困境,java,classpath,Java,Classpath,幸运或不幸的是,我不需要从命令行调用java,直到现在,我通常都在使用Maven、Ant之类的东西,或者在servlet容器中运行东西。我刚刚使用assembly:single goal将Maven中的应用程序编译到一个JAR中,从命令行运行它时遇到了严重的问题 以下是我试图做的: export JAVA_CLASSPATH="`pwd`:/path/to/remote/libs/" java -cp "${JAVA_CLASSPATH}" -jar groupId-artifactId-ver
java
,直到现在,我通常都在使用Maven、Ant之类的东西,或者在servlet容器中运行东西。我刚刚使用assembly:single goal将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
目录中,找不到该类。它似乎也找不到主类,这真的很奇怪。我做错了什么 必须使用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
旁注:通常以
I
开头的名称是为接口保留的;使用接口作为主类似乎有点奇怪。必须使用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
旁注:通常以
I
开头的名称是为接口保留的;使用接口作为主类似乎有点奇怪。-jar选项忽略了类路径(以及所有其他)选项
您需要在jar中编辑清单文件,并在其中设置类路径变量
jar选项忽略类路径(以及所有其他)选项 您需要在jar中编辑清单文件,并在其中设置类路径变量
@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构建一个(可能非常大的)类路径字符串。java可执行文件不执行任何全局绑定
编辑:请注意,我假设您没有访问Ant或Maven或其他任何好东西的权限,因为您声明您通常使用这些工具,但现在没有使用它们。@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构建一个(可能非常大的)类路径字符串。java可执行文件不执行任何全局绑定
编辑:请注意,我假设您没有访问Ant或Maven或任何好东西的权限,因为您声明您通常使用这些工具,但现在不使用。使用了
-jar
参数。然后将忽略-cp
和-classpath
。摆弄路径值不会改变这一点。已使用-jar
参数。然后将忽略-cp
和-classpath
。摆弄路径值不会改变这一点。IServer.class文件存储在哪里?就在path/to/remote/libs的顶层?它可能需要位于/path/to/remote/libs/com/my/main中,IServer.class文件存储在哪里?就在path/to/remote/libs的顶层?它可能需要位于/path/to/remote/libs/com/my/main中。我相信有一种方法可以配置Maven以生成适当的清单文件并将其包含在JAR中。不幸的是,我只使用过Maven几次,我不记得怎么用了。我建议检查Maven文档,我相信有一种方法可以配置Maven生成适当的清单文件并将其包含在JAR中。不幸的是,我只使用过Maven几次,我不记得怎么用了。我建议检查Maven文档。