从命令行运行时添加jar到类路径

12

好的,我知道这个问题之前已经被问了很多很多次,但我已经通过谷歌搜索、阅读示例并查看过去一个月的Stack Overflow上的问题,我真的无法让它工作。我想问题在于我希望能够从Eclipse和命令行运行程序。我还使用OSX,而我看到的很多示例都是为Windows/Linux而准备的。

如果我有一个简单的在Eclipse中编译的程序,并且我想要从命令行中运行它,我会这样做:

java -cp bin MyProgram

我有另一个程序在Eclipse中编译和运行,它引用了MySQL JDBC连接器(mysql-connector-java-5.1.19-bin.jar),该连接器存储在同一个目录下。这在Eclipse中很好用,但我无法从命令行运行它。

我已经尝试了所有可能的组合……

java -classpath "bin;mysql-connector-java-5.1.19-bin.jar" MyProgram
java -cp bin\;mysql-connector-java-5.1.19-bin.jar MyProgram

然后会遇到各种类找不到的错误...

Exception in thread "main" java.lang.NoClassDefFoundError: MyProgram
Caused by: java.lang.ClassNotFoundException: MyProgram
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

嗨,马特,如果我没记错的话,classpath 是用来声明要执行的主类路径。所以在这种情况下,如果你的类在 bin 文件夹中,我会尝试使用以下命令:java MyProgram 或 java -cp myprogrampath MyProgram。 - Federico Giust
1
@FedericoGiust 没有特定的要求;classpath 只是定义了一个存档文件或一组类的路径。classpath 可能包含可运行的类,也可能不包含(通常会导致异常或直接的 java.exe 错误)。Classpath 可以包括没有可运行类的目录和存档文件。 - Qix - MONICA WAS MISTREATED
5个回答

14
你的问题在于你使用了错误的分隔符。在Windows系统中,分隔符是;。但是在Unix系统中,应该使用:代替。
使用:修改后命令如下:

java -classpath "bin:mysql-connector-java-5.1.19-bin.jar" MyProgram


5

在Unix系统上,使用“:”来分隔条目:

java -classpath "bin:mysql-connector-java-5.1.19-bin.jar" MyProgram
java -cp bin:mysql-connector-java-5.1.19-bin.jar MyProgram

Eclipse会自动进行转换。


转义冒号的原因是什么? - Guillaume Polet

1

请参见:

String pathSeparator = System.getProperty("path.separator");

0

你没有在 classpath 中设置主类,请尝试在 -cp 中添加 ./


我怀疑当前目录不包含主类,我相信“bin”包含它们。 - Guillaume Polet
"MyProgram" 必须设置到类路径中,如果您将 "MyProgram" 放入包中,则需要添加包名称。 - user1335794
别担心,我对类路径和完全限定名都很了解。我只是在说,如果他的类位于bin目录中,将当前目录添加到类路径中是没有用的。 - Guillaume Polet
@GuillaumePolet,如果我不想在-cp选项前指定jar名称,有什么解决方案?是否可以在类路径中定义当前目录并将其所有jar文件包含在类路径中? - Vipin
@Vipin,你可以随时使用通配符(Java6的):-cp .;./*.jar或在Unix/Linux上使用.:./*.jar(注意Shell扩展)。 - Guillaume Polet

-2
我强烈建议您尝试--jar或-jar。我记不清是哪一个,但这些应该能解决您的问题。此外,如果您有苹果的开发工具,它们有一个JAR打包程序。

1
这是-jar,但显然他的类没有被打包。忘记苹果开发工具,它们来自上个世纪。Eclipse、NetBeans和IntelliJ在这方面遥遥领先。 - Guillaume Polet
@GuillamePolet 同意,但我只提到它们是因为它们带有一个从 JAR 文件生成应用程序的实用程序。 - Johm Don

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接