从Jar存档中读取类的Java命令行麻烦

时间:2008-11-15 22:01:06

标签: java command-line

我正在尝试使用命令行语法运行基于java的工具,如下所示:java -cp archive.jar archiveFolder.theMainClassName。虽然我正在搜索的类,主类,“theMainClassName”在归档中.jar和在输入中给出的archiveFolder中,我不断收到我的类没有看到的错误。有没有人对这个问题有任何想法?提前谢谢

5 个答案:

答案 0 :(得分:5)

以下是 工作的具体示例,因此您可以比较自己的情况。

将此代码放在任何位置,放在名为MainClass.java的文件中。 (我以后假设了一个名为src的目录。当然,通常你会安排源代码来匹配包。)

package archiveFolder;

public class MainClass
{
    public static void main(String[] args)
    {
        System.out.println("I'm MainClass");
    }
}

然后运行以下每个命令:

# Compile the source
javac -d . src/MainClass.java

# Build the jar file
jar cf archive.jar archiveFolder

# Remove the unpackaged binary, to prove it's not being used
rm -rf archiveFolder # Or rmdir /s /q archiveFolder on Windows

# Execute the class
java -cp archive.jar achiveFolder.MainClass

结果:

I'm MainClass

你是如何构建jar文件的?代码是否在相应的包中?

答案 1 :(得分:3)

theMainClassName类的顶部是否包含以下包行:

package archiveFolder

您需要将类文件与声明的包位于同一目录结构中。所以,如果你有类似的东西:

org/jc/tests/TestClass.class

其源文件必须如下所示:

package org.jc.tests;

public class TestClass {
  public static void main(String[] args) {
    System.out.printf("This is a test class!\n");
  }
}

然后你可以使用以下命令创建jar文件并从命令行运行它(假设当前目录位于顶层,就在org之上):

$ jar -cf testJar.jar org/jc/tests/*.class
$ java -cp testJar.jar org.jc.tests.TestClass

答案 2 :(得分:1)

也许是java -jar archive.jar

当然,它假设明确指向正确的班级......

你应该给出你得到的确切信息,它可能会有更多的亮点。

编辑:有关在jar清单文件中设置应用程序入口点(主类)的信息,请参阅Working with Manifest Files: The Basics

答案 3 :(得分:1)

通常,当找不到依赖类(静态成员)时会发生这种情况 - 就像这样,使用log4j:

public class MyClass {
  private static Logger log = Logger.getLogger("com.example");
}

原因是这样的静态成员的初始化可以理解为类加载的一部分 - 导致类不可用的错误(可加载),导致您描述的错误。

静态构造函数是另一个可能的原因:

public class MyClass {
  static {
     // <b>any</b> error caused here will cause the class to 
     // not be loaded. Demonstrating with stupid typecast.
     Object o = new String();
     Integer i = (Integer) o;
  }
}

答案 4 :(得分:0)

我认为其他人已经介绍了一些常见的东西。我会在罐子里装瓶,并确保列出该类。我还要仔细检查该类是否为public,方法是“public static void main(String [] arg)”。