代码之家  ›  专栏  ›  技术社区  ›  Paul Tarjan

JavaNoCuffDeFunDror当JAR清楚地拥有它时

  •  1
  • Paul Tarjan  · 技术社区  · 15 年前

    我有一个从另一个jar导入另一个类的简单类。所有的东西都很好,但是要运行它…

    $ jar tvf ../../pig-2.1.jar  | grep TupleFact
    1641 Mon Feb 02 17:56:32 UTC 2009 org/apache/pig/data/DefaultTupleFactory.class
    2289 Mon Feb 02 17:56:30 UTC 2009 org/apache/pig/data/TupleFactory.class
    $ javac ../src/Convert.java -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`
    $ java Convert -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pig/data/TupleFactory
            at Convert.<clinit>(Convert.java:31)
    Caused by: java.lang.ClassNotFoundException: org.apache.pig.data.TupleFactory
            at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
            at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
            ... 1 more
    

    有什么想法吗?如何开始调试?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Stephen C    15 年前

    我认为问题在于您运行命令的方式:

    java Convert -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`
    

    应该是

    java  -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'` Convert
    

    “Java”命令的命令行语法是:

    javac [ <options for the JVM> ... ] <classname> [ <application args> ... ]
    

    如果将“-classpath”选项放在classname之后,它将被视为应用程序参数,并且将使用默认的classpath执行应用程序。

        2
  •  3
  •   bryantsai    15 年前

    您必须将类名放在选项之后,如下所示:

    $ java -classpath <...> Convert