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文档。