Java 将GetOpt链接到主jar

Java 将GetOpt链接到主jar,java,classpath,Java,Classpath,我有一个文件夹gnu\getopt包含getopt.class,当我使用java-cp xSocket.jar;运行时,ChatDemo.jar需要它作为解析器参数;。ChatDemo.jar它产生: Exception in thread "main" java.lang.NoClassDefFoundError: gnu/getopt/Getopt at ChatDemo.main(ChatDemo.java:24) Caused by: java.lang.ClassNot

我有一个文件夹
gnu\getopt
包含
getopt.class
,当我使用
java-cp xSocket.jar;运行时,ChatDemo.jar需要它作为解析器参数;。ChatDemo.jar
它产生:

Exception in thread "main" java.lang.NoClassDefFoundError: gnu/getopt/Getopt
        at ChatDemo.main(ChatDemo.java:24)
Caused by: java.lang.ClassNotFoundException: gnu.getopt.Getopt
        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:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 1 more
ChatDemo.java:

import gnu.getopt.Getopt;
ChatDemo清单:

Manifest-Version: 1.0
Created-By: 1.6.0_22 (Sun Microsystems Inc.)
Main-Class: ChatDemo
Class-Path: xSocket.jar

看起来您正在混合运行
java
的两种方法。您应该提供一个类路径(例如使用
-cp
参数),或者从JAR文件启动。你不能两者兼而有之

如果使用JAR文件启动,则忽略
-cp
参数。在这种情况下,必须在JAR文件的清单中指定完整的类路径

ChatDemo.jar文件中的清单显然不包括。您可以通过两种方式解决此问题:

  • 将清单类路径更新为“
    类路径:xSocket.jar.
    ”。。。注意我们在这里使用空格来分隔条目,而不是
  • Getopt.class
    作为
    gnu/Getopt/Getopt.class
    添加到JAR文件中
但是,如果使用JAR文件启动,则必须使用
-JAR
选项。如果您尝试按以下方式启动应用程序:

    java -cp xSocket.jar;. ChatDemo.jar

它将无法告诉您它找不到名为
ChatDemo.jar的类;i、 e.它会将JAR文件名误解为限定的类名。

添加主类-作为包含Main方法的类的完全限定的(我的意思是根据包结构)类名。

使用
java-classpath“xSocket.JAR;;ChatDemo.JAR ChatDemo
(主类名称后没有
.JAR
)运行它


请注意,必须将包含“gnu”的文件夹添加到类路径中。另一种解决方案是将getopt类放入JAR中并将其添加到类路径中。请确保文件夹结构(
gnu\getopt
)是保存的。

gnu\getopt
它是在你的罐子下面还是外面?它在外面,如果我能把它装进去就很理想了。你的问题对我来说似乎不清楚,你要执行哪个类?它在哪里?哪个罐子是依赖的。我已经找到了解决方案。如果你有比下面更好的技巧,请随意改进。Thanks.so将gnu/getopt/getopt.class添加到类路径中,如xSocket.jar中所示;gnu/getopt/getopt.class是否正确?请参阅我的更新答案。(jar文件清单规范没有明确说明如何将非JARed类/目录放入类路径中,但我看到论坛帖子说这是一种方法。)不!正如我所说:将包含gnu文件夹的文件夹添加到您的类路径中。如果您像这样启动应用程序,您可以忽略清单中的类路径条目。否则,将“.”添加到类路径条目中。如果您添加“gnu”,Java将查找
gnu\gnu\getopt\…
!哦!谢谢!我保证这项工作不会使用“.”在xSocket.jar之前。我打赌这是Java有史以来最困难的争论。@Aaron-很多人都这么认为,但我还没有看到一个更好的替代方案。@Stephen C:一个好的开始是允许混合使用
-cp
-jar
(这将允许加载JDBC驱动程序而不必记住复杂的主类名)。接下来,如果
java
更有帮助,那就太好了。我缺少诸如“列出所有main()方法”、命令行选项解析这样的选项,以便它可以为您的main方法显示良好的帮助等。是的。。。应用程序对参数的良好处理肯定会得到改进,但许多问题与(外部)命令shell的原始交互有关。(如果您感兴趣,请查看我们在JNode中所做的工作。)